CREATE TRIGGER命令用於定義和命名一個觸發器,然後把這個觸發器存放在數據庫中。
CREATE [ OR REPLACE ] TRIGGER name
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE } [ OR ...]
ON table
[ FOR EACH ROW ]
[ DECLARE
declarations ]
BEGIN
statements
END;
name是觸發器的名稱。
如果指定了[ OR REPLACE ]子句,並且同一模式中存在相同名稱的觸發器,那麼新定義的觸發器將替代原先的那個。
如果沒有指定[ OR REPLACE ]子句,將不允許替代同一模式中具有相同名稱的觸發器。
如果指定了BEFORE子句,那麼新定義的觸發器是before類型觸發器。
在一個before類型行級觸發器中,在觸發事件操作每一行記錄之前,都要執行觸發器代碼塊。
而在before類型語句級觸發器中,觸發器代碼塊是在觸發語句執行之前執行。
如果指定了AFTER子句,那麼觸發器是一個after類型觸發器。
在一個after類型行級觸發中,在觸發事件操作每一行記錄之後,執行觸發器代碼塊。
在after類型語句級觸發器中,觸發器代碼塊是在執行觸發語句之後執行。
我們必須指定INSERT,UPDATE或DELETE中的任意一個來分別定義插入,更新或刪除的觸發事件,
當我們用多個保留的觸發事件關鍵字定義觸發器事件時,可以用關鍵字OR把它們分隔開。
table是表的名稱,在這個表上定義的觸發器事件會對觸發器進行激活。
如果指定了[ FOR EACH ROW ]子句,那麼就把觸發器定義爲行級的觸發器。
如果沒有使用這個子句,那麼觸發器就是一個語句級觸發器。
declarations是變量,遊標或類型的聲明。
statements是SPL程序語句。
BEGIN-END是一個可以包含異常處理部分的代碼塊。
在觸發器代碼塊中,可以使用一些特定的變量進行操作,它們包括:
NEW
NEW是一個僞記錄名稱,用來指向在行級觸發器中向表中進行插入和更新操作而產生的新記錄值。
這個變量不能在語句級觸發器和行級觸發器的刪除操作中應用。
它的用法是::NEW.column, 其中column是觸發器所在表中列的名稱。
當使用before類型行級觸發器的時候,:NEW.column的初始內容是新記錄的列值,
這個值是新插入或者替代原有記錄的新記錄中列的值。而當在after類型行級觸發器中使用的時候,
這個值已經存放在表中,因爲已經對所影響的記錄進行了相應操作。
在觸發器代碼塊中,可以像使用其他變量那樣使用:NEW.column ,
如果在一個before類型行級觸發器代碼塊中將一個值分配給了:NEW.column,
所分配的值就在新插入或更新的記錄中使用。
OLD
OLD是一個僞列名,用來指向在行級觸發器中更新和刪除操作涉及到原先表中的值。
這個變量不能在語句級觸發器和行級觸發器的插入操作中應用。
它的用法是::OLD.column, 其中column是觸發器所在表中列的名稱。
當使用before類型行級觸發器的時候,:OLD.column的初始內容是列的值,
這個值是被刪除或者被替代記錄中列的值。當在after類型行級觸發器使用的時候,
這個值不再 存放在表中,因爲已經對所影響的記錄進行了相應操作。
在觸發器代碼塊中,可以像其他變量那樣使用:OLD.column ,
如果在一個before行級觸發器代碼塊中將一個值分配給了:OLD.column,那麼在觸發器的操作上就沒有實際作用了。
INSERTING
INSERTING 是一個條件表達式,如果插入操作觸發了觸發器,那麼這個表達式返回真,否則返回假。
UPDATING
UPDATE是一個條件表達式,如果更新操作觸發了觸發器,那麼這個表達式返回真,否則返回假。
DELETING
DELETE是一個條件表達式,如果是刪除操作觸發了觸發器,那麼這個表達式返回真,否則返回假。