• 数据库原理笔记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是提供各种数据管理功能的服务器

    随便用
  • 相关阅读:
    Arduino通信篇系列之print()和write()输出方式的差异
    通信协议之Modbus协议(一)
    CAD制图系列一之绘图、标注、修改、视图
    Arduino系列之pwm控制LED灯(呼吸灯)
    [转]GDB调试基础
    Linux上编辑然后执行一段脚本的机制
    [转]进程创建-终结流程图
    [ 转]Linux进程关系
    Linux进程管理(四、 进程终结)
    Linux进程管理(三、 线程)
  • 原文地址:https://www.cnblogs.com/pqhuang/p/13032599.html
Copyright © 2020-2023  润新知