觸發器
這篇博客拿兩個例子來解釋一下什么是行級觸發器和語句級觸發器。
**例子1:**當對表SC的Grade屬性進行修改時,若分數增加了10%,則將此次操作記錄到另一個表SC_U(Sno CHAR(8)、Cno CHAR(5)、Oldgrade SMALLINT、Newgrade SMALLINT )。
CREATE TRIGGER SC_T
AFTER UPDATE ON SC
REFERENCING
OLD AS OldTuple,
NEW AS NewTuple
FOR EACH ROW
WHEN (NewTuple.Grade >= 1.1 * OldTuple.Grade)
BEGIN
INSERT INTO SC_U (Sno,Cno,OldGrade,NewGrade)
VALUES(OldTuple.Sno,OldTuple.Cno,OldTuple.Grade,NewTuple.Grade)
END
**例子2:**將每次對表Student的插入操作所增加的學生個數記錄到表 Student InsertLog(numbers INT)中。
CREATE TRIGGER Student_Count
AFTER INSERT ON Student
REFERENCING
NEWTABLE AS Delta
FOR EACH STATEMENT
BEGIN
INSERT INTO StudentInsertLog (Numbers)
SELECT COUNT(*) FROM Delta
END
第一個例子演示的是行級觸發器,而第二個例子則是語句級觸發器。
行級觸發器在每次修改一行記錄時被激活。對于一個 INSERT
、UPDATE
或 DELETE
語句影響的每一行,觸發器將執行一次。語句級觸發器在執行完一個 INSERT
、UPDATE
或 DELETE
語句后被激活。無論該語句影響了多少行,觸發器只執行一次。
在第一個例子中,當表SC的Grade被修改時,觸發器都會檢查新分數是否比舊分數增加了10%或更多。如果是,則執行觸發動作,觸發動作為將更新前后的分數及其他相關信息插入到 SC_U表中。
在第二個例子中,每當對 Student表執行 INSERT
語句時,觸發器在整個插入操作完成后被激活。而每個INSERT
操作可以是插入一行,也可以是插入多行。作為語句級觸發器,并不關心一次INSERT
是插入多少行,而等到整個INSERT
操作后,計算本次 INSERT
語句插入的行數,并將這個計數插入到 StudentInsertLog
表中。