[英]Create trigger for SQLite, when new record is inserted, to delete old records
[英]Trigger (possibly stored procedure) to replace text when a new record is inserted?
我遇到了障碍。 我们开发的应用程序允许用户创建文件链接,但是链接是相对于SQL数据库所在的服务器而不是相对于用户创建的。
这是我需要发生的一些伪代码。
when dbo.File_.Link_to_File has a prefix of '\\dc\App Share'
replace '\\dc\App Share' with 'Z:'
本质上,文件链接是相对于服务器( \\\\dc\\App Share
)存储的,但是我已将其映射为所有用户计算机上的网络驱动器(Z :)。 我需要一个触发器,该触发器将服务器路径前缀替换为Z:
请记住,这是文件( \\\\dc\\App Share\\myfolder\\myfile.txt
)的前缀(路径),因此代码只需查找此前缀并替换它即可。
它在SQL Server 2008 R2上运行。
任何帮助表示赞赏。 非常感谢!
我不知道为什么公司坚持使用瞬态映射驱动器而不是UNC路径,但这应该可行。
UPDATE
dbo.File_
SET
Link_to_File = 'Z:' + SUBSTRING(Link_to_File, 15, LEN(Link_to_File) - 14)
WHERE
Link_to_File LIKE '\\dc\App Share%'
顺便说一句,如果您正在寻找a来确保以后的数据正确无误,那么您应该将该逻辑放入您的应用程序中。 理想情况下,您的应用程序已经使用存储过程来更新数据,因此您可以添加类似于上面的代码来更新保存Link_to_File的传入参数。 就像是:
IF (@Link_to_File LIKE '\\dc\App Share%')
SET @Link_to_File = 'Z:' + SUBSTRING(Link_to_File, 15, LEN(Link_to_File) - 14)
CREATE TRIGGER File_Insert ON dbo.File
INSTEAD OF INSERT
AS
DECLARE @LinkColumn varchar(50)
SET @LinkColumn = (SELECT Link_to_File FROM INSERTED)
IF (LEFT(@LinkColumn, 1) <> 'Z')
BEGIN
SELECT * INTO #Inserted FROM Inserted
UPDATE #Inserted SET Link_to_File = REPLACE(Link_to_File,'\\dc\App Share','Z:')
INSERT INTO dbo.File_ SELECT * FROM #Inserted
END
ELSE
INSERT INTO dbo.File_SELECT * FROM Inserted
我没有任何测试方法。 用db名称替换数据库,用表名称替换表,用列名称替换urlcolumn
CREATE TRIGGER trigger_name ON database.table
INSTEAD OF INSERT
AS
DECLARE @UriColumn varchar(150)
SET @UriColumn = (SELECT urlcolumn FROM INSERTED)
IF (@UriColumn like '\\dc\App Share' + '%')
BEGIN
SET @UriColumn = replace(@UriColumn, '\\dc\App Share', 'Z:'
SELECT * INTO #Inserted FROM Inserted
UPDATE #Inserted SET urlcolumn = @UriColumn
INSERT INTO table SELECT * FROM #Inserted
END
ELSE
INSERT INTO table SELECT * FROM Inserted
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.