zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    Android中Context具体解释 ---- 你所不知道的Context
    JDK6、Oracle11g、Weblogic10 For Linux64Bit安装部署说明
    matplotlib 可视化 —— 定制 matplotlib
    matplotlib 可视化 —— 移动坐标轴(中心位置)
    matplotlib 可视化 —— 移动坐标轴(中心位置)
    matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)
    matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)
    指数函数的研究
    指数函数的研究
    指数分布的研究
  • 原文地址:https://www.cnblogs.com/john2017/p/6364513.html
Copyright © 2011-2022 走看看