2016-02-19 156 views
1

我有一個FileTable FT和另一個表AT。在AT,我在FT擴展文件的元數據屬性。SQL Server 2014:更新FileTable觸發器File_Stream.PathName()

我試圖創建一個觸發器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 Path列而不是實際路徑中嗎?

回答

1

你觸發了主要缺陷的,你似乎認爲它會被稱爲行一次 - 那是的情況。

的觸發條件會每條語句一次,因此,如果您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 
+0

我會投了如果我有足夠的代表。謝謝你,@marc_s。 – GibralterTop