ME触发器简介

1、触发器不能显式的调用

    触发器有三部分组成:

     (1)触发器语句(事件),定义激活触发器的DML事件和DDL事件

     (2)触发器限制,执行触发器的条件,该条件必须为真才能激活触发器

     (3)触发器操作(主体) ,包含一些sql语句和代码,他们在发生触发器语句且触发限制的值为真时运行。

create or replace trigger trig_sal

after update of empsal on salary_records ---为salary_records表创建trig_sal触发器,在更新empsal列时激活

...........

when (new.empsal>old.empsal)

declare

sul_diff number

..........

begin

sul_diff:=:new.empsal-:old.empsal

dbms_output.put_line(‘工资差是:'sal_diff);

end; ---when子句中的条件满足,将执行being块中的代码。

 

2、创建触发器

   create or replace trigger aiu_itemfile

   after insert on itemfile

   for each row

   begin

     if (:NEW.qty_hand=0) then

       dbms_output.put_line('警告:已插入纪录,但数量为零');

    else

      dbms_output.put_line('已插入纪录');

    end if;

end;

 

3 、触发器类型

     模式(DDL)触发器-->在模式中执行DDL语句时执行

     数据库级触发器----> 在发生打开、关闭、登陆和退出数据库等系统事件时执行

     DML触发器  --〉  在对表和视图执行DML语句时执行

                     (

                      行级触发器---〉对DML语句修改的每个执行一次

                       语句级触发器---〉无论受影响的行数是多少,都只执行一次

                       instead of触发器---〉用于用户不能直接使用DML语句修改的视图

                      )

 

  行级触发器:

      create table test_trg

           (id number, name varchar2(20));

 

      create sequence seq_test;

 

      create or replace trigger bi_test_trg

        before insert or update of id on test_trg

        for each row

       begin

           if inserting then

              select seq_test .nextval into :new.id from dual;

          else

             raise_application_error(-20020,'不允许更新ID值!');

          end if;

       end;

 

    语句级触发器

    create or replace trigger trgdemo

      after insert or update or delete on order_master

    begin

      if updating then

         dbms_output.put_line('已更新order_master中的数据');

      elsif deleting then

         dbms_output.put_line('已删除oreder_master中的数据');

      elsif inserting then

         dbms_output.put_line('已在order_master中插入数据');

     end if;

   end;

 

3、触发器的限制

     SELECT 语句必须是SELECT INTO语句或内部游标声明

     不允许DDL声明或事务控制语句

     如果由触发器调用,则存储子程序不能包括事务控制语句

    :old 和:new值得类型不能事LONG和LONG RAW

4、触发器 触发顺序

     Before语句级

     Before行级

     DML

     After行级

     After语句级

5、INSTEAD OF 触发器

     CREATE OR REPLACE TRIGGER upd_ord_view

      instead of update on ord_view

    FOR EACH ROW

    BEGIN

         UPDATE order_master

         SET vencode=:NEW.vencode

          WHERE orderno=:NEW.orderno;

         dbms_outpu.put_line('已激活触发器');

   END;

6、模式触发器

  CREATE TABLE dropped_obj(

   obj_name varchar2(30),

   obj_type  varchar2(20),

   drop_type DATE);

 

 CREATE OR REPLACE TRIGGER log_drop_obj

 AFTER DROP ON SCHEMA

 BEGIN

   INSERT INTO dropped_obj

   VALUES( ORA_DICT_OBJ_NAME,ORA_DICT_OBJ_TYPE,SYSDATE);

END;

 

7、启用、禁用和删除触发器

    ALTER TRIGGER aju_itemfile DISABLE;

    ALTER TRIGGER aju_itemfile ENABLE;

    DROP TRIGGER aju_itemfile;

 

8、查看有关触发器的信息

 SELECT TRIGGER_NAME FROM USER_TRIGGERS

  WHERE TABLE_NAME='EMP';

 

   SELECT TRIGGER_TYPE,TRIGGERING_EVENT,WHEN_CLAUSE FROM USER_TRIGGERS

    WHERE TRIGGER_NAME='BIU_EMP_DEPTNO';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值