触发器
这篇博客拿两个例子来解释一下什么是行级触发器和语句级触发器。
**例子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
表中。