2012-03-24 70 views
7

我正在對基於SQL Server 2000的傳統應用程序進行一些調整,不用說我只想做最小的事情,因爲它可能會全部崩潰。INSTEAD OF UPDATE觸發器 - 這可能嗎?

我有一個用戶的大表,tbUsers,與IsDeleted BIT標誌。我想將所有當前和未來的IsDeleted = 1用戶記錄歸檔到我的歸檔表tbDeletedUsers中。

移動當前被刪除的用戶很簡單,但我想要一種方法來移動設置了IsDeleted標誌的未來用戶。我可以在列上使用標準的AFTER觸發器,但是我打算在tbUser表中添加一些違反此約束的約束,我希望我的INSTEAD OF UPDATE觸發器觸發並將記錄移動到歸檔表中?

我想我的問題是......是否有可能在更新某個列時觸發INSTEAD OF UPDATE觸發器?這是我到目前爲止:

CREATE TRIGGER trg_ArchiveUsers 
INSTEAD OF UPDATE ON tbUsers 
AS 
    BEGIN 
     ... 
    END 
GO 

如果是這樣一個例子(SQL 2000兼容)將不勝感激!

回答

12

使用UPDATE(columnname)測試,可以在檢查觸發特定的列是否被更新(再採取具體行動),但你不能有一個觸發只對特定列的更新。無論實際更新的目標是哪一列,它都會在執行更新後立即觸發。

所以,如果你認爲你必須使用INSTEAD OF UPDATE觸發,你需要實現兩個種類的動作在裏面:

1)插入tbDeletedUserstbUsers +刪除 - 當IsDeleted被更新(或,更確切地說,更新設置爲1);

2)更新tbUsers正常 - 當IsDeleted沒有更新(或更新,但未設置爲1)。

由於多行可以用一個UPDATE指令進行更新,你可能還需要考慮到一些行可能IsDeleted設置爲1和其他人沒有。

我不是INSTEAD OF觸發一個大風扇,但如果我真的不得不使用一個像你這樣的任務,我可能會忽略UPDATE()測試和實施這樣的觸發:

CREATE TRIGGER trg_ArchiveUsers 
ON tbUsers 
INSTEAD OF UPDATE 
AS 
BEGIN 
    UPDATE tbUsers 
    SET 
    column = INSERTED.column, 
    … 
    FROM INSERTED 
    WHERE INSERTED.key = tbUsers.key 
    AND INSERTED.IsDeleted = 0 
    ; 
    DELETE FROM tbUsers 
    FROM INSERTED 
    WHERE INSERTED.key = tbUsers.key 
    AND INSERTED.IsDeleted = 1 
    ; 
    INSERT INTO tbDeletedUsers (columns) 
    SELECT columns 
    FROM INSERTED 
    WHERE IsDeleted = 1 
    ; 
END 
+1

最新動態( columnName)在SQL Server中不存在。而是使用COLUMNS_UPDATED(columnName)。 http://msdn.microsoft.com/en-us/library/ms186329.aspx – 2013-01-04 21:19:08

+1

謝謝你的評論。你是對的,在SQL Server中沒有UPDATES()函數,也沒有UPDATED(),正如我最初寫的那樣。它實際上稱爲[UPDATE()](http://msdn.microsoft.com/en-us/library/ms187326.aspx)。編輯我的答案,並再次感謝我的錯誤引起我的注意。 – 2013-01-05 11:44:21

+0

而你似乎也錯了,因爲COLUMNS_UPDATED()不接受參數。它返回一個位掩碼,它反映了調用觸發器的語句所影響的所有列。我從來沒有使用過這個功能,但是從手冊來看,我想我已經有了一個大概的想法。 – 2013-01-05 11:49:48

相關問題