平时主要用的行级触发器,最近用到语句级触发器,看资料说“是以语句为单位执行的触发器”,没太搞明白到底什么意思,哪位给详细说下,最好举个例子解释下。

解决方案 »

  1.   

    语句级,也就是表级!对表进行触发的,不管这个表上有多少条数据,不管是有还是无行受到影响都只触发一次,before和after各触发一次,如果是定义的before表级触发器,那么只在before动作之前触发,after相反。
    总之,一句话就是:语句就是表,表级触发器不管是否有无行受到影响都要触发有且仅一次!
      

  2.   

    语句级触发器,每执行一次触发语句,该触发器就会被执行一次,也就是说,不管触发语句影响多少行,该触发器只会执行一次。不用for  each row 。不管你的操作是涉及到一行或者多行,都会执行一次触发器。
    例如只希望能在上班时间访问某个表,就应该使用语句级触发器。
    例如,只希望在工作日访问a表
    create or replace trigger a_biud
      before insert or update or delete on a
    declare
      v_day varchar2(10);
    begin
      v_day := rtrim(to_char(sysdate, 'day'));
      if v_day like ('S%') then
        raise_application_error(-20000,
                                'a table cannot e modified during off hours');
      end if;
    end;
      

  3.   

    谢谢楼上提供的资料,不知道我这样理解对不对:
    假设我要在update时触发,对于行级触发器,如果我用update语句一下update掉5行,就会触发5此;
    对于语句级触发器,如果我用update语句一下update掉5行,只会针对这个update触发一次。如果再用update语句update一下,就会再触发一次。不知道我上面理解的对不对
      

  4.   


    对的,就算你update 0行,语句级触发器也要执行一次