這個月我會繼續上個月的專欄——“SQL Server觸發器的基礎知識及其特點” 。我開這個專欄的目的是為了回應我收到的許多關於觸發器的問題。我會從 INSTEAD OF 觸發器以及它與AFTER 觸發器差別開始講起。然後我會在討論一些使用 INSTEAD OF 觸發器的情形。其中包括允許幾個視圖對多個表進行更新。最後,我會討論觸發器怎樣去處理事務,編寫改變某個表中多行記錄的觸發器,以及確定在觸發器中哪些列被修改。
INSTEAD OF 觸發器 AFTER 觸發器(也叫“FOR”觸發器)會在觸發 insert、update 或是delect 動作之後執行。例如,一個 Employees 表上的 AFTER 觸發器會在在 Employee 表上執行一條 update 語句後激活。因此,AFTER 觸發器只有在已插入一行或是多行和所有約束已被處理且通過後才觸發。INSTEAD OF 觸發器和 AFTER 觸發器有本質上的不同,因為 INSTEAD OF 觸發器代替觸發動作進行激發。就拿同樣的例子來說,如果在 Emplyees 表上有一個 INSTEAD OF UPDATE 觸發器和在這個表上執行一條 UPDATE 語句,結果是這條 UPDATE 語句並不會改變 Employee 表中的任何一行。相反,這條 UPDATE 語句只有是為了踢離 INSTEAD OF UPDATE 觸發器,這個觸發器可能會,也可能不會改變 Employees 表中的數據。
因此,怎麼決定在合適的時間和位置放置 INSTEAD OF 觸發器呢?有幾個關鍵的因素在做決定是值得考慮的。AFTER 觸發器多用在動作必須在表中數據發生改變之後才執行後情情況。比如,AFTER 觸發器可以用於將對數據作任何變動的日志記錄在一個相對獨立的審計表中。INTEAD OF 觸發器也能做同樣的工作。但是 INSTEAD OF 觸發器在這個情況下的效率比較低,因為更新動作只能在將它發生的動作准確地記錄在審計表之後才允許執行。
一般來說,只要不影響數據的修改,AFTER 觸發器比 INSTEAD OF 觸發器更有效率。在對數據進行計算或是對數據的修改作為一個整體提交或是作為一個整體回退的情況下,AFTER 觸發器也是一個很好的選擇。例如,存在這樣一條規則:對在 Products 表的產品價格的變動超過30%的必須回退。AFTER 觸發器能很漂亮地完成這個工作,它利用已插入同已刪除的表中的產品價格作比較,然後在有必要的時回滾事務。這些都是 AFTER 觸發器的理想條件,但有時 INSTEAD OF會更好些。
INSTEAD OF 觸發器有一個很大的特點——就是它允許你在某個表或視圖上用多個復雜的查詢操作來代替單一的查詢。跟 AFTER 觸發器只能對表起作用不同,INSTEAD OF 觸發器可以同時對表和視圖起作用。我常常被問到怎麼樣去解決這種情況:有一個多表組成的視圖,如何對該視圖進行一次更新。如果視圖包含有關鍵字段和包含有基本表的某些字段,這只是簡單的更新基本表。但是,當有視圖中包含有多個基本表示,邏輯上的更新比單單一個 UPDATE 語句會更復雜。因此,你是怎麼利用什麼可以替代的工具來解決這個問題的呢?其中一個方法就是將一個INSTEAD OF 觸發器放在視圖上。INSTEAD OF 觸發器可以定義在一個或多個表上.INSTEAD OF 觸發器就能轉開在多個基本表中修改的范圍.
例如,如果一個視圖將 Customers、Products、orders 和 OrderDteils 等表合並成一個視圖,並利用視圖通過程序在屏幕上來顯示所有的數據。