触发器是事件驱动程序
事件的含义 是SQL语句,即SQL语句的执行看做一个事件,具体又分为执行前和执行后。
看个例子,假定预先建立了表U,当Grade 增加了10%,记录到表U中
1 CREATE TRIGGER SC_T AFTER UPDATE OF Grade ON SC 2 REFERENCING OLD ROW AS Oldtuple NEW ROW AS Newtuple 3 FOR EACH ROW 4 WHEN (Newtuple.Grade>=1.1*Oldtuple.Grade) 5 INSERT INTO U 6 VALUES(Oldtuple.Sno, Oldtuple.Cno, Oldtuple.Grade, Newtuple.Grade)
CREATE TRIGGER 建立触发器的 关键字
AFTER UPDATE OF Grade ON SC 触发事件:更新SC的grade列之后
FOR EACH ROW 表示行级触发,一条SQL语句可能影响多行,每影响一行,触发器执行一次,这叫做 行级触发器
WHEN (Newtuple.Grade>=1.1*Oldtuple.Grade) 表达条件:当Grade增加了10%
INSERT INTO U
VALUES(Oldtuple.Sno, Oldtuple.Cno, Oldtuple.Grade, Newtuple.Grade) 把新旧变化记录到表U里
OLD ROW AS Oldtuple : 变化前的行,取名 Oldtuple 。
NEW ROW AS Newtuple: 变化后的行,取名Newtuple。
新例子
教授工资不少于4000,假定有一张Teacher表里边存了所有教师的信息包括教授,表里有一列列名是job,job=professor表示是教授,现在看 教授工资不少于4000 的触发器怎么写
1 CREATE TRIGGER Insert-Or-Update-Sal 2 BEFORE INSERT OR UPDATE ON Teacher 3 FOR EACH ROW 4 Begin 5 IF (new.Job=‘professor’) AND (new.Sal<=4000) 6 THEN new.Sal:=4000; 7 END IF; 8 END
当你要改某个人的工资,提交一条update语句,在执行update语句之前会先执行上边的触发器程序,执行完触发器程序以后,再执行update语句
如果写了一条 update 语句,把教授工资改成 3000,那么怎么办?
一种做法是,在这条语句执行之前 拦截 update语句,也就是说,update语句还没有执行,由触发器,把 new 中的工资 改成4000
update语句再执行的时候,工资项的数据就不再是原来语句中的数据,而是被触发器矫正过的数据,即修改的 工资项 是4000
一种做法是,把BEFORE改成After能不能达到相同的效果,理论上可以。因为,教授的工资被改到4000以下,可以在改动完成后进行矫正,但是,上边的触发器程序做不到这一点。因为,new.Sal:=4000 这一句。无法在update语句执行之后,再起作用。即 无法在update语句执行之后,再修改表。那么,就引出一个新问题。如果想用after触发器完成 教授工资不少于4000,触发器程序该怎么写?tips:只要把THEN后的语句改成可执行的SQL语句即可
将插入操作后增加的学生个数记录到S_log表中
1 CREATE TRIGGER S_Count 2 AFTER INSERT ON Student 3 REFERENCING NEW TABLE AS TB 4 FOR EACH STATEMENT 5 INSERT INTO S_log(Number) 6 SELECT COUNT(*) 7 FROM TB
假定预先建立了表S_log,大部分内容跟前边差不多,CREATE TRIGGER S_Count 建立触发器,事件 AFTER INSERT ON Student
FOR EACH STATEMENT 表示语句级触发器:整条语句执行完,触发器再执行一次
REFERENCING NEW TABLE AS TB 表示变化后的行形成的临时表(NEW TABLE 关键字,表示变化后的行形成的临时表)
触发器的作用
- 各种检查,检查条件达不到不让语句执行
- 修正语句执行结果
触发器存在的问题
因为触发器属于程序设计范畴类似于高级语言。所以,每家公司都按照自己的想法做了很多东西进去,对用户来说,几乎是有一种DBMS,就有一种 触发器语言
换句话说,在一种DBMS上写的触发器,几乎不可能原封不动的拿到另一种DBMS上执行,这一点正好跟SQL相反
触发器的执行
一条语句提交给DBMS可能会触发一批触发器,这样就有一个执行次序问题
基本次序:BEFORE触发器->SQL ->AFTER触发器
什么是DBMS?
DBMS是 SQL解释器,是 数据管理器,是 安全管理器,是 完整性控制器,是 数据库程序解释器
随着我们继续学下去这个问题的答案还会增长.当然,所有功能都围绕着一个核心,就是 数据管理.
从这个角度,我们可以概括地说,DBMS是提供各种数据管理功能的服务器