oracle触发器实例

本文介绍了Oracle数据库中的触发器,包括触发器的定义、组成、语句触发器语法及行触发器的使用。通过具体例子展示了如何创建、管理触发器,以及在特定条件下阻止DML操作。内容涵盖触发器在数据审计和业务规则限制上的应用。
--触发器
   --- 触发器定义:触发器是指存放在数据库中,并被隐含执行的存储过程。
   --- 触发器组成:触发事件、触发条件、触发操作
       --语句触发器语法:
         create [or replace] trigger trigger_name
         timing event1[or event2 or event3] on table_name
         PL/SQL block;
         --其中:
                trigger_name  用于指定触发器的名称
                timing  指定触发器时机
                event 指定触发器事件
                table_name  指定对应的表名

        ---当在触发器中同时包含多个触发事件(insert、update、delete),为了在触发器代码区分具体的触发事件,可使用
        ---条件谓词:
                insert/update/delete:当事件被触发时,返回true,否则返回false
        --例子1:
        create or replace trigger tr_sec_emp
        before insert or update or delete onscott.emp
        --PL/SQL块
        declare
               --可以在此处声明变量
        begin
          --判断
          if to_char(sysdate,'DY','nls_date_language=AMERICAN') in ('SAT','SUN') then
            case 
              when inserting then
                raise_application_error(-20001,'不能在休息日插入员工信息!');
              when updating then
                raise_application_error(-20002,'不能在休息日更新员工信息!');
              when deleting then 
                raise_application_error(-20003,'不能在休息日删除员工');
            end case;
         end if;
        end tr_sec_emp;
        --执行触发器成功,输入以下语句:
        update scott.emp set ename='张三';--如果是在星期六或星期天不能修改
        
        delete from scott.emp;---如果是在星期六或星期天不能删除
        
        
        
        --禁用触发器tr_sec_emp:
               alter trigger tr_sec_emp disable ;
        
        ----行触发器:行触发器是指执行DML操作时,每作用一行就触发一次(审计数据变化时,可使用行触发器)
        ------行触发器的语法:
               create [or replace ] trigger trigger_name
               timing event1[or event2 or event3] on table_name
               for each row[when condition]
               PL/SQL block;
               
              --其中:
              trigger_name  用于指定触发器的名称
              timing  指定触发器时机
              event 指定触发器事件
              table_name  指定对应的表名
              for each row 表示建立行触发器
              when  子句可选

                
           ----例子2:(:new.xxx---新数据    :old.xxx----旧数据)
           create or replace trigger tr_emp_sal
           before update on scott.emp 
           for each row
           begin
             if :new.sal<:old.sal then 
               raise_application_error(-20010,'工资只能涨,不能降');
             end if;
           end tr_emp_sal;---结束触发器
           
           --执行触发器tr_emp_sal成功,输入以下语句:
           update scott.emp set sal=100;---不能更改
           
           
           
           ---管理触发器
                  --1.显示触发器信息
                  select * from user_triggers;
                  
                  --2.禁用触发器
                  alter trigger 触发器名 disable;
                  
                  --3.激活触发器
                  alter trigger 触发器名 enable;
                  
                  --4.禁止或激活表的所有触发器
                  alter table emp disable all triggers;--禁止
                  
                  alter table emp enable all triggers;---激活
                  --5.重新编译触发器
                  alter trigger 触发器名 compile;
                  
                  --6.删除触发器
                  drop trigger 触发器;
          
      
               
               
               
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值