关键词搜索

源码搜索 ×
×

Oracle 触发器

发布2020-05-31浏览567次

详情内容

一、触发器的基本概念

数据库触发器是一个与表相关联的、存储的 PL/SQL 程序。每当一个特定的数据操作语句
(Insert,update,delete)在指定的表上发出时, Oracle 自动地执行触发器中定义的语句序列。

触发器可用于:
数据确认,实施复杂的安全性检查,做审计,跟踪表上所做的数据操作等,数据的备份和同步

触发器,就是制定一个规则,在我们做增删改操作的时候,只要满足该规则,自动触发,无需调用。

(1)触发器的类型:

  • 语句级触发器 : 在指定的操作语句操作之前或之后执行一次,不管这条语句影响
    了多少行 。
  • 行级触发器(FOR EACH ROW) : 触发语句作用的每一条记录都被触发。在行级触
    发器中使用 old 和 new 伪记录变量, 识别值的状态。
    在这里插入图片描述
语句级触发器:不包含有for each row的触发器。
行级触发器:包含有for each row的就是行级触发器。
加for each row是为了使用:old或者:new对象或者一行记录。

    示例:

    • 范例:插入员工后打印一句话“一个新员工插入成功”
      在这里插入图片描述
    • 范例:不能在休息时间插入员工
      在这里插入图片描述
      当执行插入时会报错:
      在这里插入图片描述

    (2)在触发器中触发语句与伪记录变量的值:
    在这里插入图片描述

    • 范例:判断员工涨工资之后的工资的值一定要大于涨工资之前的工资
      在这里插入图片描述
      在这里插入图片描述
    ---语句级触发器
    ----插入一条记录,输出一个新员工入职
    create or replace trigger t1
    after
    insert
    on person
    declare
    
    begin
      dbms_output.put_line('一个新员工入职');
    end;
    ---触发t1
    insert into person values (1, '小红');
    commit;
    select * from person;
    
    ---行级别触发器
    ---不能给员工降薪
    ---raise_application_error(-20001~-20999之间, '错误提示信息');
    create or replace trigger t2
    before
    update
    on emp
    for each row
    declare
    
    begin
      if :old.sal>:new.sal then
         raise_application_error(-20001, '不能给员工降薪');
      end if;
    end;
    ----触发t2
    select * from emp where empno = 7788;
    update emp set sal=sal-1 where empno = 7788;
    commit;
    
      4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    二、触发器实现主键自增

    触发器实现主键自增,这属于行级触发器
    分析:在用户做插入操作的之前,拿到即将插入的数据,给该数据中的主键列赋值。

    ------给该数据中的主键列赋值。
    create or replace trigger auid
    	before
    	insert
    	on person
    	for each row
    declare
    
    begin
    	select s_person.nextval into :new.pid from dual;
    end;
    --查询person表数据
    select * from person;
    ---使用auid实现主键自增
    insert into person (pname) values ('a');
    commit;
    insert into person values (1, 'b');
    commit;
    
      4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载