CREATE TRIGGER <触发器名> {BEFORE|AFTER} <触发事件> ON <表名> REFERENCING NEW|OLD ROW AS <变量> FOR EACH {ROW|STATEMENT} [WHEN<触发条件>]<触发动作体>
# 行级触发器示例:对SC的Grade属性进行修改时,若分数增加10%,则将此次操作记录到另一个SC_U(Sno,Cno,Oldgrade,Newgrade)中。 CREATE TRIGGER SC_T AFTER UPDATE OF Grade ON SC REFERENCING OLDROW AS OLDTuple NEWROW AS NEWTuple FOR EACH ROW WHEN(NewTuple.Grade >= 1.1*OldTuple.Grade) INSERT INT SC_U(Sno,Cno,OldGrade,NewGrade) VALUES(OldTuple.Sno,OldTuple.Cno,OldTuple.Grade,NewTuple.Grade)
# 语句级触发器示例:每次对标Student的插入操作增加的学生个数记录到新表中 CREATE TRIGGER Student_Count AFTER INSERT ON Student REFERENCING NEW TABLE AS DELTA FOR EACH STATEMENT INSERT INTO StudentInsertLog(Numbers) SELECT COUNT(*)FROM DELTA
# 定义一个BEFOER行级触发器,教授工资不得低于4000,如果低于4000,自动改为4000
CREATE TRIGGER Insert_Or_Update_Sal BEFORE INSERT OR UPDATE ON Teacher REFERENCING NEW row AS newTuple FOR EACH ROW BEGIN IF(newtuple.Job='教授') AND (newtuple.Sal<4000) THEN newtuple.Sal:=4000 END IF; END;
事件-条件-动作
只有表的拥有者创建者才能在表上创建触发器。
触发器名,统一模式下唯一
表名,只能定义在基本表上。
触发事件,INSERT、DELETE、UPDATE或其组合时间。ALTER|BEFORE触发时机。
触发器类型,FOR EACH ROW行级触发器,在每一行变化后触发,可以引用行级变量OLDROW和NEWROW;FOR EACH STATEMENT语句级触发器,在整个语句执行完后触发,可以引用表级变量OLD TALBE和NEW TABLE。