触发器(trigger)

       触发器是存放数据库中一种特殊的子程序。它不能被用户直接调用,而是当特定的事件或操作发生时
由系统自动调用执行的,依据事件的不同,可将触发器器分为:DML触发器、系统事件触发器、和替代触发器

编写触发器时,注意:
    1、触发器不接受参数
    
    2、一个表上最多可有触发器是有限的(12个),同一时间、同一事件的触发器只能有一个
     
    3、表上触发器越多,对表上DML操作的性能影响就越大

    4、触发器有大小限制,最大为32K,若确定需要,可以先建过程,在触发器中调过程

    5、在触发器的执行部分(代码主体)中,不能使用DDL

    6、触发器中也不能使用事务控制语句(如commit  rollback  savepoint)

   
触发器的组成:
    1)触发事件
   
    2)触发条件
   
    3)触发时刻


创建DML触发器
    CREATE OR REPLACE TRIGGER trigger_name
    BEFORE|AFTER event ON table_name
    [FOR EACH ROW]    #加了这一个就是行级触发器,如果不加就是语句级
    [DECLARE]
    BEGIN
    body
    END;


    例:定一个触发器,禁止用主户在非工作时间修改emp表
    create or replace trigger change_emp
    before insert or update or delete on scott.emp
    begin
        if (to_char(sysdate,'fmhh24') not between 9 and 18) then
            raise_application_error(-20000,'DML on ad 9:00-18:00');
        end if;
    end;
    /


创建DDL触发器

    例:创建一个DDL触发器,禁止用户创建对象
    create or replace trigger t1
    before create on scott.schema
    begin
        raise_application_error(-20000,'current schema can not create object');
    end;
    /
   
    DDL触发事件表
   
    ALTER         alter 修改一个数据库对象
    ANALYZE        分析、统计一个数据库对象时
    AUDIT        记录审计动作时
    CREATE        创建对象时
    DDL        包括 ALTER、ANALYZE、AUDIT、 NOAUDIT、COMMENT、CREATE、RENAME、
            REVOKE、DROP、GRANT、TRUCATE

    NOAUDIT       
    COMMENT   
    RENAME
    GRANT   
    REVOKE
    DROP
    TRUCATE

创建数据库事件触发器
   
    数据库事件
   
    LOGON        登录(只允许 after 触发器)
    LOGOFF        退出(只允许 before 触发器)
    STARTUP        启动(只允许 after 触发器)
    SHUTDOWN    停机(只允许 before 触发器)
    SERVERERROR    出错时(只允许 after 触发器)

查看触发器:
    dba_triggers;
    dba_source;

禁用触发器:
    ALTER TRIGGER trigger_name DISABLE

    SQL> alter trigger sys.change_emp disable;

启用触发器:
    ALTER TRIGGER trigger_name ENABLE

    SQL> alter trigger sys.change_emp enable;

有时表上的触发器比较多的时候,可以考虑禁用表上的所有触发器,或者开启表上所有触发器
    ALTER TABLE table_name DISABLE ALL TRIGGERS;

    ALTER TABLE table_name ENABLE ALL TRIGGERS;

    SQL> alter table scott.emp enable all triggers;
       
替代触发器
    又叫 instenad of 触发器,一般用户多表、复杂视图时比较常见,当有时在这些视图上
    进行数据操作不方便或者不能直接执行时,可以用这种触发器来替代

创建格式:
    CREATE [OR REPLACE] TRIGGER trigger_name
    INSTEAD OF event [OF column_name]
    ON view_name FOR EACH ROW
    [WHEN condition]
    [DECLARE]
    BEGIN
        body
    END;



例:创建视图:
    SQL> grant create view to scott;
    SQL> create or replace view emp_v1 as
      2  select empno,ename,d.deptno,dname,loc from scott.emp e,scott.dept d
      3  where e.deptno=d.deptno;

创建一个插入的替代触发器:
    CREATE OR REPLACE TRIGGER emp_v1_t1
    INSTEAD OF INSERT ON emp_v1 FOR EACH ROW
    DECLARE
        v_counter NUMBER;
    BEGIN
        SELECT COUNT(*) INTO v_counter FROM scott.dept WHERE deptno=:new.deptno;
        if v_counter=0 then
            INSERT INTO scott.dept (deptno,dname,loc) values
             (:new.deptno,:new.dname,:new.loc);
        end if;
    END;
    /   

触发器的其他问题:
    1、触发器的名称
    触发器有自己独立的命名空间,与其它对象同名,不会造成影响,但不推荐

    2、触发器中不能声明 LONG、LONG RAW 之类的变量

    3、禁止在sys拥有对象上创建触发器

 






   
 


 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21175589/viewspace-755683/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21175589/viewspace-755683/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值