觸發器(trigger)是SQL server 提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發,好比當對一個表進行操做( insert,delete, update)時就會激活它執行。觸發器常常用於增強數據的完整性約束和業務規則等。 ——百度百科程序員
(1) 監視地點(table)數據庫
(2) 監視事件(insert|update|delete)測試
(3) 觸發時間(before|after)spa
(4) 觸發事件(insert|update|delete)code
備註:保持每一個數據庫的觸發器名惟一。server
simple example:blog
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added';
分析:CREATE TRIGGER用來建立名爲newproduct的觸發器。觸發器可在一個操做發生以前或以後執行,這裏給出了AFTER INSERT,因此此觸發器將在INSERT語句成功後執行。FOR EACH ROW(代碼對每一個插入行執行)。在這個例子中,文本Product added將對每一個插入的行顯示一次。事件
查看已有觸發器: SHOW TRIGGERS;
get
刪除已有觸發器: DROP TRIGGER trigger_name;
數據分析
在INSERT觸發器代碼內,可引用一個名爲NEW的虛擬表,訪問被插入的行;
在BEFORE INSERT觸發器中,NEW中的值也能夠被更新(容許更改被插入的值);
對於AUTO_INCREMENT列,NEW在INSERT執行以前包含0,在INSERT執行以後包含新的自動生成值。
example:
CREATE TRIGGER neworder AFTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num INTO @num;
分析:在插入一個新訂單到orders表時,MySQL生成一個新訂單號並保存到order_num中。觸發器從NEW.order_num取得這個值並返回它。對於orders的每次插入使用這個觸發器將老是返回新的訂單號。
測試:
INSERT INTO orders(order_date,cust_id) VALUES(Now(),10001);
注:從MySQL5之後不支持觸發器返回結果集
在DELETE觸發器代碼內,可引用一個名爲OLD的虛擬表,訪問被刪除的行;
OLD的值全都是隻讀的,不能更新。
example(使用OLD保存將要被刪除的行到一個存檔表中):
CREATE TRIGGER deleteorder BEFORE DELETE ON orders FOR EACH ROW BEGIN INSERT INTO archive_orders(order_num,order_date,cust_id) VALUES(OLD.order_num,OLD.order_date,OLD.cust_id); END;
分析:在任意訂單被刪除執行此觸發器。它使用一條INSERT語句將OLD中的值(要被刪除的訂單)保存到一個名爲archive_orders的存檔中(爲實際使用這個例子,你須要用與orders表相同的列建立一個archive_orders的表)。
在DELETE觸發器代碼中,可引用一個名爲OLD的虛擬表訪問之前(UPDATE語句前)的值,引用一個名爲NEW的虛擬表訪問新更新的值;
在BEFORE DELETE觸發器中,NEW中的值可能也被更新(容許更改將要用於UPDATE語句中的值);
OLD的值全都是隻讀的,不能更新。
example(保證州名縮寫老是大寫,無論UPDATE語句中給出的事大寫仍是小寫):
CREATE TRIGGER updatevendor BEFORE UPDATE ON vendors FOR EACH ROW SET NEW.vend_state = Upper(NEW.vend_state);
分析:顯然,任何數據淨化都須要在UPDATE語句以前進行。每次更新一行是,NEW。vend_state中的值(未來用來更新行的值)都用Upper(NEW.vend_state)替換。