1 断言

2 触发器

trigger触发器是用户定义在关系表示的一类由事件驱动的特殊过程。用户操作,自动激活触发器。

2.1 定义触发器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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。
  • 触发条件,触发条件为真时,动作执行
  • 触发体动作,过程块。

2.2 激活触发器

触发器执行由触发事件激活,并由数据库服务器自动执行。

触发顺序

  • 执行该表上的BEFOR触发器
  • 激活触发器的SQL语句
  • 执行该表上的AFTER触发器。

如果同一个表上存在多个BEFORE、AFTER触发器,遵循先创建限制性的原则,按照触发器的创建的时间先后顺序执行。

2.3 删除触发器

1
DROP TRIGGER <触发器名> ON <表名>;