插入新记录时触发(可能是存储过程)替换文本?
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 中的触发器在批处理上运行,而不是一次记录。以上是关于插入新记录时触发(可能是存储过程)替换文本?的主要内容,如果未能解决你的问题,请参考以下文章