繁体   English   中英

SQL Server 2014:更新File_Stream.PathName()时触发FileTable

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

当我执行查询时,它旋转。 我打算让它通宵运行,以防万一它决定做点什么。

我希望ATPath列从FT更新到更新的file_stream.PathName()

触发逻辑吗?

我应该将file_stream BLOB存储在AT路径列而不是实际路径中吗?

您的触发器存在主要缺陷,因为您似乎认为每行将调用一次该触发器-事实并非如此。

该触发器将对每个语句触发一次 ,因此,如果导致该触发器触发的UPDATE语句插入25行,则会触发一次 ,但是DeletedInserted伪表将各包含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.

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