觸發器之刪除某行字段自動備份 作者:企業庫 時間:2010-4-8 10:52:07
|
起先開始寫一個簡單的觸發器: create TRIGGER trigger_delete_TMaintain
(這邊介紹一下: SET NOCOUNT ON的作用: 當 SET NOCOUNT 為 ON 時,不返回計數(表示受 Transact-SQL 語句影響的行數)。當 SET NOCOUNT 為 OFF 時,返回計數。
開始執行上面的觸發器,問題來了。 提示錯誤: 消息 311,級別 16,狀態 1,過程 trigger_delete_TMaintain,第 12 行
問題出在:create TRIGGER trigger_delete_TMaintain
(介紹一下: AFTER
after在sql2005裏沒有,等同於for。
還有個問題: 提示錯誤: 消息 213,級別 16,狀態 1,過程 trigger_delete_THardRepair,第 12 行
因為刪除表裏面多了字段,導致錯誤。怎麼辦? 很簡單:insert into TDeleteHardRepairLog
問題解決了,執行一下,沒有問題。接着我們去刪除: 測試語句:(SELECT * from Tmaintain
執行delete from Tmaintain where MAINTAINID=1,問題又來了。 提示錯誤: 消息 544,級別 16,狀態 1,過程 trigger_delete_TMaintain,第 12 行
應改為SET IDENTITY_INSERT 允許將顯式值插入表的標識列中。就是off改成on。 在插入前後添加,SET IDENTITY_INSERT TDeleteMaintainLog ON; insert into。。。 SET IDENTITY_INSERT TDeleteMaintainLog OFF; 問題解決了,執行一下,沒有問題。接着我們去刪除: 還是沒有被刪除掉,但是有自動備份了。 怎麼辦?方法應該是沒有錯。 想可不可以在這個觸發器裏刪除。 在插入後面添加: delete THardRepair where HardRepairID in (select HardRepairID from DELETED) 執行一下,沒有問題。接着我們去刪除: 可以了,刪除了並且自動備份了。 大功告成。 代碼如下: -- ================================================
END
(説明一下: SQL2000中,inserted表和deleted表用於存放對錶中數據行的修改信息。他們是觸發器執行時自動創建的,放在內存中,是臨時表。當觸發器工作完成,它們也被刪除。它們是隻讀表,不能向它們寫入內容。
inserted表:用來存儲INSERT和UPDATE語句所影響的行的副本。意思就是在inserted表中臨時保存了被插入或被更新後的記錄行。在執行 INSERT 或UPDATE 語句時,新加行被同時添加到inserted表和觸發器表中。因此,可以從inserted表檢查插入的數據是否滿足需求,如不滿足則回滾撤消操(cāo)作。
deleted表:用來存儲DELETE和UPDATE語句所影響行的副本。意思是在delete表中臨時保存了被刪除或被更新前的記錄行。在執行 DELETE 或 UPDATE 語句時,行從觸發器表中刪除,並傳到deleted表中。所以可以從deleted表中檢查刪除的數據行是否能刪除。
所以當表中某條記錄的某項值發生變化時,變化前的值已經通過系統自動創建的臨時表deleted表和inserted表保存了被刪除行或插入的記錄行的副本。我們可以從這兩個表中查詢出變化前的值並賦給變量。)
|