繁体   English   中英

插入新记录时是否触发(可能是存储过程)替换文本?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM