2012-08-10 124 views
4

我有一个表'game.FileAttachments',其中有一个stream_id列,链接到File表的stream_id列'game.Attachments'。我在File表上创建了一个Update触发器来更新链接表上的stream_id;原因是,当File表中的文件被修改时,stream_id会改变。这是我的触发器;请帮助!我的更新触发器为Sql Server 2012 FileTable发生了什么问题

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 

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

+0

由于您的删除触发器测试,问题是否已更改?现在是“为什么Sql Server 2012 FileTable的更新触发器除了Microsoft Word文档之外还能工作?”还是这个问题也回答您的满意(即MS Word克隆和删除)? – peterk411 2013-11-15 18:56:00

回答

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子句中......要么,或者您错误地引用该表和需要将“已删除”附件捕获到临时表中?