Oracle数据库触发器失败回滚

时间:2010-04-24 12:05:30

标签: oracle triggers

我想创建一个在更新表时执行的触发器。

特别是在更新表时我希望通过触发器更新另一个表,但如果触发器失败(REFERENTIAL INTEGRITY-- ENTITY INTEGRITY),我不想再执行更新了。

有关如何执行此操作的任何建议吗?

使用触发器或通过存储过程以字母方式进行是否更好?

由于

2 个答案:

答案 0 :(得分:3)

触发器中的DML是与触发DML相同的操作的一部分。两者都必须成功或失败。如果触发器引发未处理的异常,则整个语句将回滚。

这是T23上的触发器,它将行复制到T42。

SQL> create or replace trigger t23_trg
  2      before insert or update on t23 for each row
  3  begin
  4      insert into t42 values (:new.id, :new.col1);
  5  end;
  6  /

Trigger created.

SQL>

成功进入T23 ...

SQL> insert into t23 values (1, 'ABC')
  2  /

1 row created.

SQL> select * from t42
  2  /

        ID COL
---------- ---
         1 ABC

SQL>

但是由于对T42.ID的唯一约束,这个会失败。如您所见,触发语句也会回滚......

SQL> insert into t23 values (1, 'XYZ')
  2  /
insert into t23 values (1, 'XYZ')
            *
ERROR at line 1:
ORA-00001: unique constraint (APC.T24_PK) violated
ORA-06512: at "APC.T23_TRG", line 2
ORA-04088: error during execution of trigger 'APC.T23_TRG'


SQL> select * from t42
  2  /

        ID COL
---------- ---
         1 ABC

SQL> select * from t23
  2  /

        ID COL
---------- ---
         1 ABC

SQL>

答案 1 :(得分:0)

如果触发器失败,它将引发异常(除非您明确指示不要),在这种情况下,您将进行客户端回滚。如果通过触发器或SP完成它并不重要(尽管在SP中保持逻辑事务通常是一个好主意,而不是将其分布在触发器周围)。