[英]SQL Server 2014 : FileTable trigger on update File_Stream.PathName()
我有一个FileTable FT
和另一个表AT
。 在AT
,我在FT
扩展了文件的元数据属性。
我尝试在ON FT FOR UPDATE
上创建一个触发器,该触发器将更新AT
的文件路径。
这是我尝试过的:
ALTER TRIGGER [dbo].[u_filepath]
ON [FileDB].[dbo].[FT]
FOR UPDATE
AS
Declare @newpath nvarchar(1000)
Declare @oldpath nvarchar(1000)
select @newpath = file_stream.pathname()
from inserted
select @oldpath = file_stream.pathname()
from deleted
update AT
set [Path] = @newpath
where [Path] = @oldpath
GO
当我执行查询时,它旋转。 我打算让它通宵运行,以防万一它决定做点什么。
我希望AT
的Path
列从FT
更新到更新的file_stream.PathName()
。
触发逻辑吗?
我应该将file_stream BLOB存储在AT路径列而不是实际路径中吗?
您的触发器存在主要缺陷,因为您似乎认为每行将调用一次该触发器-事实并非如此。
该触发器将对每个语句触发一次 ,因此,如果导致该触发器触发的UPDATE
语句插入25行,则会触发一次 ,但是Deleted
和Inserted
伪表将各包含25行。
您的代码将在这25行中选择哪一行?
select @newpath = file_stream.pathname()
from inserted
这是不确定的,您将获得任意一行,而将忽略所有其他行 。
您需要重写触发器以考虑到这一点-使用基于集合的方法来更新数据-而不是基于行的方法-类似这样:
ALTER TRIGGER [dbo].[u_filepath]
ON [FileDB].[dbo].[FT]
FOR UPDATE
AS
-- create a CTE to get the primary key, old and new path names
WITH UpdatedPaths AS
(
SELECT
i.PrimaryKey,
OldPathName = d.file_stream.pathname(),
NewPathName = i.file_stream.pathname()
FROM
Inserted i
INNER JOIN
Deleted d ON i.PrimaryKey = d.PrimaryKey
)
-- update the "AT" table where the old and new path names don't match
UPDATE dbo.AT
SET [Path] = up.NewPathName
FROM UpdatedPaths up
WHERE
up.OldPathName <> up.NewPathName
dbo.AT.PrimaryKey = up.PrimaryKey
GO
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.