• PL/SQL 07 触发器 trigger


    --触发器

    触发器有三类:
     数据操作触发器
        用before触发器进行数据校验
        用after触发器进行级联操作
        语句触发器限制数据的操作和记录操作日志
        instead of 触发器(只针对视图不允许DML操作时)
     数据定义触发器
        监视数据库中用户的一些重要操作
     系统触发器


    --触发器的限制

    不应该使用事务控制语句
    COMMIT, ROLLBACK, SAVEPOINT

    由触发器调用的任何过程与函数都不能使用事务控制语句

    不能声明任何LONG或LONG RAW变量

    可以访问的表有限

    变化表
    被DML语句正在修改的表,亦即定义触发器的表

    限制表
    有些表在创建的时候就带有参考完整性限制的声明
    主键与外键

    触发器主体中的限制
    不可以读取或修改任何变化表
    不可以读取或修改限制表的主键,唯一值列,外键列


    --数据操作触发器

    create or replace trigger 触发器名字
      before/after  insert/update/delete
      on 表名/视图名
      for each row
    declare
      变量定义;
    begin
      代码;
    end;


    --for each row为行级触发器,去掉为语句级触发器

    :new.字段  数据操作后的内容
    :old.字段  数据操作前的内容


    --禁止向t_score表中添加微机原理的成绩

    create or replace trigger trg_insert_sco
    before insert
    on t_score
    for each row
    declare
      coursename t_course.coursename%type;
    begin
      select coursename
      into coursename
      from t_course
      where courseno=:new.courseno;
      if coursename='微机原理' then
        raise_application_error(-20001,'该课程已经考试结束,不能添加成绩记录');
      end if;
    end;


    --当学生表中添加一条记录时,自动为此学生添加高等数学期中成绩,分数设为null

    create or replace trigger trg_insert_stu
    after insert
    on t_student
    for each row
    begin
      insert into t_score
      values(:new.stuno,'期中',(select courseno
                                from t_course
                                where coursename='高等数据'),null);
    end;
          
    --语句触发器
    --禁止8:00到18:00对成绩表进行操作

    create or replace trigger trg_ope_sco
    before insert or update or delete
    on t_score
    begin
      if (to_char(sysdate,'hh24:mi') not between '8:00' and '18:00')
        then 
        raise_application_error(-20004,'不能再非工作时间对t_score表进行操作');
      end if;
    end;


    --instead of 触发器
    --对于含有连接或子查询的视图,一般无法进行DML操作,可以用instead of 触发器实现

    create or replace trigger 触发器名字
    instead of insert/update/delete
    on 视图名
    for each row
    declare
      变量定义;
    begin
      代码;
    end;

    create or replace trigger trg_update_vw_cou_tea
    instead of update
    on vw_cou_tea
    for each row
    declare
      tno t_teacher.teano%type;
    begin
      select teano
      into tno
      from t_teacher
      where teaname=:new.teaname;
      update t_course
      set teano=tno
      where coursename=:old.coursename;
    end;  


    --数据定义语言触发器

    create or replace trigger 触发器名字
    before/after 用户事件
    on database|schema
       declare
      变量定义;
    begin
      代码;
    end;


    --用户事件包括create、alter、drop、用户登录login等

    --禁止用户删除数据库对象 

    create or replace trigger trg_drop
    before drop
    on schema
    begin
      raise_application_error(-20005,'不能删除');  
    end;
     
    --触发器(OEM)

    create trigger bmbtrigger
    before insert or update or delete
    on bmb
    begin
    if(to_char(sysdate,'DAY'))='SUN'
    then
    RAISE_APPLICATION_ERROR(-20600,'you can not update table on weekend.');
    end if;
    end;


    create or replace trigger gzbtrigger
    after insert or update or delete
    on gzb
    declare suminconme number
    begin
    select sum(income) into sumincome from gzb;
    if sumincome<50000
      then
      raise_application_error(-20001,'收入低于2万');
    end if;
    end;

  • 相关阅读:
    Spring Boot(三):SpringBoot多模块(module)项目搭建
    Spring Boot(二):数据库操作
    Spring Boot(一):入门篇+前端访问后端
    Maven详解之仓库------本地仓库、远程仓库
    单例模式
    Spring常用注解
    初识Spring Bean
    SpringMVC常用注解
    Spring注解与否
    Maven入门
  • 原文地址:https://www.cnblogs.com/john2017/p/6364513.html
Copyright © 2020-2023  润新知