我想创建一个在更新表时执行的触发器。
特别是在更新表时我希望通过触发器更新另一个表,但如果触发器失败(REFERENTIAL INTEGRITY-- ENTITY INTEGRITY),我不想再执行更新了。
有关如何执行此操作的任何建议吗?
使用触发器或通过存储过程以字母方式进行是否更好?
由于
答案 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中保持逻辑事务通常是一个好主意,而不是将其分布在触发器周围)。