数据库原理笔记2020/6/2

触发器是事件驱动程序

事件的含义 是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 关键字,表示变化后的行形成的临时表)

触发器的作用

  1. 各种检查,检查条件达不到不让语句执行
  2. 修正语句执行结果

触发器存在的问题

因为触发器属于程序设计范畴类似于高级语言。所以,每家公司都按照自己的想法做了很多东西进去,对用户来说,几乎是有一种DBMS,就有一种 触发器语言

换句话说,在一种DBMS上写的触发器,几乎不可能原封不动的拿到另一种DBMS上执行,这一点正好跟SQL相反

触发器的执行

一条语句提交给DBMS可能会触发一批触发器,这样就有一个执行次序问题

基本次序:BEFORE触发器->SQL ->AFTER触发器

什么是DBMS?

DBMS是  SQL解释器,是 数据管理器,是 安全管理器,是 完整性控制器,是 数据库程序解释器

随着我们继续学下去这个问题的答案还会增长.当然,所有功能都围绕着一个核心,就是 数据管理.

从这个角度,我们可以概括地说,DBMS是提供各种数据管理功能的服务器

数据库原理笔记2020/6/2

上一篇:mysql_alter_table函数流程的部分修改和注解


下一篇:MySQL一致性非锁定读原理以及MVCC简介