1、oracle中触发器中的after和before有什么区别
2、分别用在什么场合
3、还有语句级触发和行级触发有什么区别?
  给些实例如果可以运行马上结帖!

解决方案 »

  1.   

    1、oracle中触发器中的after和before有什么区别
    一个是在记录操作之前触发,一个是在记录操作之后触发。2、分别用在什么场合
    比如表之间定义的有外键,在删除主键时,必须要先删除外键表,这时就有先后之分。3、还有语句级触发和行级触发有什么区别?
    如果定义为语句级,则Delete  from t执行时,触发器只运行一次,如果定义为行级,则上面的Delete操作将使触器运行多次(有几条记录就运行几次)。
      

  2.   

    补充楼上
    inserting 操作 :new
    update 操作 :new,:old ,如果更新某个字段触发使用if updating('col') then ......
    delete 操作 :old
      

  3.   

    1、oracle中触发器中的after和before有什么区别
    before是在语句执行之前执行触发器,after是在语句执行之后再执行触发器的,但两种情况下语句都会执行.
    2、分别用在什么场合3、还有语句级触发和行级触发有什么区别?
    语句级触发器是在整个语句执行的前或后 执行,而行级是对于一行操作来说的 ,语句级的可以阻止某些语句的执行.
      

  4.   

    1:after是表经过修改以后才触发,before就正好是在保存之前就触发
    2:比如:
    create or replace trigger tri_emp
    before inert or update deptno on emp
    for each row
    when (new.deptno<>40)
    begin
    :new.comm:=0;
    end;
    /
    这段的意思就是创建或替代tri_emp触发器。
    在插入或者更新表emp的每一行的deptno这一列之前如果新的DEPTNO的值不等于四十
    然后就执行SQL块里的内容。如果把before换成after的话就是在插入或更新之后做后面的操作.
    3:行级触发器是对DML语句影响的每个行执行一次
    如update语句影响多行,就会对每行都激活一次触发器。
    而语句级触发器是对每个DML语句执行一次
    如insert语句在表中插了300多行,那么这个表上的insert语句级触发器只会执行一次。这样说你能明白了不?
      

  5.   

    junqiang(蓝色海洋)和hongqi162(失踪的月亮) 
    已经说的较完整了
      

  6.   

    可以参考 oracle触发器与存储过程 
    专门讲这个的。触发器一般用来保证数据完整性,存储过程据说用来提高复杂逻辑的处理效率,但实际使用中不建议用存储过程,按分层的思想,持久层就不应出现业务逻辑,建议将此部分转移动代码中实现。细节楼上已经说明了,我就不重复了。
      

  7.   

    完全建议楼主去看看基础的ORACLE书籍 上面都有很完整的介绍
      

  8.   

    呵呵 我发现有时候CSDN会错乱一样
    几年前的帖子被放在第一页
    要不然就是已经结贴的帖子放在第一页
    很奇怪
      

  9.   

    1、oracle中触发器中的after和before有什么区别 
    一个是在记录操作之前触发,一个是在记录操作之后触发。 2、分别用在什么场合 
    比如表之间定义的有外键,在删除主键时,必须要先删除外键表,这时就有先后之分。 3、还有语句级触发和行级触发有什么区别? 
    如果定义为语句级,则Delete     from   t执行时,触发器只运行一次,如果定义为行级,则上面的Delete操作将使触器运行多次(有几条记录就运行几次)。
      

  10.   

    一、最简单的区别,当然还有其他的区别
    1、触发顺序上有所区别
      语句级别触发器before
      行级别触发器before
      行级别触发器after
      语句级别触发器after
    2、触发次数区别 语句级别触发器只触发一次、行级触发器是作用了多少行触发多少次。[TEST@ora10gr1#2009-12-18/21:08:09] SQL>create or replace trigger t1_triger_before
      2  before insert on t1
      3  begin
      4      dbms_output.put_line('语句级别触发器before');
      5  end;
      6  /Trigger created.[TEST@ora10gr1#2009-12-18/21:08:09] SQL>create or replace trigger t1_triger_after
      2  after insert on t1
      3  begin
      4      dbms_output.put_line('语句级别触发器after');
      5  end;
      6  /Trigger created.[TEST@ora10gr1#2009-12-18/21:08:09] SQL>create or replace trigger t1_triger_before_each_row
      2  before insert on t1 for each row
      3  begin
      4      dbms_output.put_line('行级别触发器before');
      5  end;
      6  /Trigger created.[TEST@ora10gr1#2009-12-18/21:08:09] SQL>create or replace trigger t1_triger_after_each_row
      2  after insert on t1 for each row
      3  begin
      4      dbms_output.put_line('行级别触发器after');
      5  end;
      6  /Trigger created.[TEST@ora10gr1#2009-12-18/21:08:09] SQL>
    [TEST@ora10gr1#2009-12-18/21:08:09] SQL>set serveroutput on
    [TEST@ora10gr1#2009-12-18/21:08:09] SQL>--注意触发顺序
    [TEST@ora10gr1#2009-12-18/21:08:09] SQL>insert into t1 values(1,'a');
    语句级别触发器before
    行级别触发器before
    行级别触发器after
    语句级别触发器after1 row created.[TEST@ora10gr1#2009-12-18/21:08:09] SQL>--注触发发次数
    [TEST@ora10gr1#2009-12-18/21:08:09] SQL>insert into t1
      2    select 1,'a' from dual union all
      3    select 2,'b' from dual union all
      4    select 3,'c' from dual;
    语句级别触发器before
    行级别触发器before
    行级别触发器after
    行级别触发器before
    行级别触发器after
    行级别触发器before
    行级别触发器after
    语句级别触发器after3 rows created.
      

  11.   

    junqiang(蓝色海洋) 和 hongqi162(失踪的月亮)   
    已经说的较完整了
      

  12.   

    http://blog.csdn.net/liyongjie/article/details/3018274