我的Sql Server 2012 FileTable的更新触发器有什么问题

时间:2012-08-10 02:29:06

标签: triggers sql-server-2012 filetable

我有一个表'game.FileAttachments',它有一个stream_id列,链接到File表的stream_id列,'game.Attachments'。我在File表上创建了一个Update触发器,用于更新链接表上的stream_id;原因是,当修改File表中的文件时,stream_id会发生变化。这是我的触发器;请帮助!

CREATE TRIGGER game.tr_Update_Attachments
   ON  game.Attachments
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    IF ( UPDATE(stream_id) )
    BEGIN
        UPDATE game.FileAttachments
            SET stream_id = i.stream_id
            FROM inserted i
            WHERE game.FileAttachments.stream_id IN
            (
                SELECT d.stream_id
                    FROM deleted d INNER JOIN 
                         game.FileAttachments f ON f.stream_id = d.stream_id
            )
    END
END

也尝试了这个:

IF ( UPDATE(stream_id) )
BEGIN
    UPDATE game.FileAttachments
        SET stream_id = i.stream_id
        FROM inserted i INNER JOIN
             deleted d ON 1 = 1 INNER JOIN 
             game.FileAttachments f ON f.stream_id = d.stream_id
END

但这也行不通。

好的,我创建了一个删除触发器来测试理论;与我正在修改的文件关联的FileTable记录未更新,而是被删除,并创建了一个全新的记录。好吧,事实证明,对于Word Word医生来说,这是事实。但是,创建了一个纯文本文件,我可以根据需要多次更新,并且stream_id永远不会更改。所以,Microsoft Word,应用程序似乎克隆了原始文档,给它一个临时名称,然后,当用户选择保存它时,原始文件被简单地删除,并且克隆重命名与原始文件相同。那个BYTES!

1 个答案:

答案 0 :(得分:0)

我认为您的触发器定义需要具备此功能:

CREATE TRIGGER game.tr_Update_Attachments
ON  game.Attachments
AFTER UPDATE, DELETE

正如您所说:

SELECT d.stream_id
                FROM deleted d INNER JOIN 
                     game.FileAttachments f ON f.stream_id = d.stream_id
你的where子句中的

...或者你错误地引用了这个表并需要将“已删除”的附件捕获到临时表中?