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

Posted

技术标签:

【中文标题】插入新记录时触发(可能是存储过程)替换文本?【英文标题】:Trigger (possibly stored procedure) to replace text when a new record is inserted? 【发布时间】:2011-06-24 16:04:59 【问题描述】:

我遇到了障碍。我们开发的一个应用程序允许用户创建指向文件的链接,但这些链接是相对于 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 上运行的。

感谢任何帮助。非常感谢!

【问题讨论】:

谢谢大家,我最终解决的方法略有不同,但您的贡献帮助很大!我使用了 REPLACE 函数并在插入后触发了更新。 【参考方案1】:

我不知道为什么公司坚持使用临时映射驱动器而不是 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%'

顺便说一句,如果您正在寻找一个以确保数据在未来是正确的,那么您应该将该逻辑放入您的应用程序中。理想情况下,您的应用程序已经使用存储过程来更新数据,因此您可以添加与上述类似的代码来更新包含 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)

【讨论】:

【参考方案2】:
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

【讨论】:

假设只发送一条记录。非常差的触发器实践,因为 SQL Server 中的触发器在批处理上运行,而不是一次记录。【参考方案3】:

我没有办法对此进行测试。用数据库名替换数据库,用你的表名替换表,用你的列名替换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

【讨论】:

假设只发送一条记录。非常差的触发器实践,因为 SQL Server 中的触发器在批处理上运行,而不是一次记录。

以上是关于插入新记录时触发(可能是存储过程)替换文本?的主要内容,如果未能解决你的问题,请参考以下文章

触发存储过程运行而不是 INSERT (PL/SQL)

查询代码在哪个视图存储过程函数触发中使用过

Oracle 12 PL/SQL 在触发器中检索存储过程名称

Mysql触发器

sql sever的sql语句有关存储过程与触发器

SQL server触发器存储过程操作远程数据库插入数据,解决服务器已存在的问题