After和Instead of觸發器,instead觸發器
l After觸發器:這類觸發器是在記錄已經改變完之後(after),才會被啟用執行,它主要是用於記錄變更後的處理或檢查,一旦發現錯誤,也可以用Rollback Transaction語句來復原本次的操作。
l Instead Of觸發器:這類觸發器一般是用來取代原本的操作,在記錄變更之前發生的,它並不去執行原來SQL語句裡的操作(Insert、Update、Delete),而去執行觸發器本身所定義的操作。
After觸發器的工作原理
After觸發器是在記錄更變完之後才被啟用執行的。以刪除記錄為例:當SQL Server接收到一個要執行刪除操作的SQL語句時,SQL Server先將要刪除的記錄存放在刪除表裡,然後把資料表裡的記錄刪除,再啟用After觸發器,執行After觸發器裡的SQL語句。執行完畢之後,刪除記憶體中的刪除表,退出整個操作。
還是舉上面的例子:在產品庫存表裡,如果要刪除一條產品記錄,在刪除記錄時,觸發器可以檢查該產品庫存數量是否為零,如果不為零則取消刪除操作。看一下資料庫是怎麼操作的:
(1)接收SQL語句,將要從產品庫存表裡刪除的產品記錄取出來,放在刪除表裡。
(2)從產品庫存表裡刪除該產品記錄。
(3)從刪除表裡讀出該產品的庫存數量欄位,判斷是不是為零,如果為零的話,完成操作,從記憶體裡清除刪除表;如果不為零的話,用Rollback Transaction語句來復原操作。
Instead Of觸發器的工作原理
Instead Of觸發器與After觸發器不同。After觸發器是在Insert、Update和Delete操作完成後才啟用的,而Instead Of觸發器,是在這些操作進行之前就啟用了,並且不再去執行原來的SQL操作,而去運行觸發器本身的SQL語句。
注意事項:
l After觸發器只能用於資料表中,Instead Of觸發器可以用於資料表和視圖上,但兩種觸發器都不可以建立在暫存資料表上。
l 一個資料表可以有多個觸發器,但是一個觸發器只能對應一個表。
l 在同一個資料表中,對每個操作(如Insert、Update、Delete)而言可以建立許多個After觸發器,但Instead Of觸發器針對每個操作只有建立一個。
l 如果針對某個操作即設定了After觸發器又設定了Instead Of觸發器,那麼Instead of觸發器一定會啟用,而After觸發器就不一定會啟用了。
l Truncate Table語句雖然類似於Delete語句可以刪除記錄,但是它不能啟用Delete類型的觸發器。因為Truncate Table語句是不記入日誌的。
l WRITETEXT語句不能觸發Insert和Update型的觸發器。
l 不同的SQL語句,可以觸發同一個觸發器,如Insert和Update語句都可以啟用同一個觸發器。
Instead Of觸發器的使用範圍
Instead Of觸發器可以同時在資料表和視圖中使用,通常在以下幾種情況下,建議使用Instead Of觸發器:
l 資料庫裡的資料禁止修改:例如電信部門的通話記錄是不能修改的,一旦修改,則通話費用的計數將不正確。在這個時候,就可以用Instead Of觸發器來跳過Update修改記錄的SQL語句。
l 有可能要復原修改的SQL語句:如11.5.3節中的例二,用After觸發器並不是一個最好的方法,如果用Instead Of觸發器,在判斷折扣大於0.6時,就中止了更新操作,避免在修改資料之後再復原操作,減少伺服器負擔。
l 在視圖中使用觸發器:因為After觸發器不能在視圖中使用,如果想在視圖中使用觸發器,就只能用Instead Of觸發器。
l 用自己的方式去修改資料:如不滿意SQL直接的修改資料的方式,可用Instead Of觸發器來控制資料的修改方式和流程。