How many times the **row level trigger** will fire when we update 10 rows?
假设表中有10行有行级触发器,当我们更新10行时,行级别触发器会触发多长时间?
答案 0 :(得分:1)
在大多数情况下,如果更新10行,触发器将被触发10次。但是有些情况违反了这个通用规则,Tom Kyte很好地描述了这些规则。这些情况是" DML语句重启"。
http://tkyte.blogspot.ru/2010/04/that-old-restart-problem-again.html
请仔细阅读。我不会说任何新的东西,简而言之:
1) Suppose I create row-level before update trigger for the table:
SQL> create table t (x int, y int);
Table created.
SQL> insert into t values(1,1);
1 row inserted.
SQL> commit;
SQL> create or replace trigger t_tr
2 before update on t
3 for each row
4 begin
5 dbms_output.put_line('Fired');
6 end;
7 /
Trigger created.
现在,如果我在单个会话中更新表 - 我得到" 1行更新= 1次触发器触发":
SQL> set serveroutput on
SQL> update t set x = 1;
Fired
1 row updated.
SQL> rollback;
假设现在在一个会话中我更新表T并更改Y列的值:
SQL> update t set y = 2 where y = 1;
1 row updated.
在第二次会议中,我尝试更新表T中的第X列,并依赖于第一次交易中正在更改的值Y = 1:
SQL> update t set x = 1 where y = 1;
我必须等待第一笔交易完成。在第一次交易中提交后,我进入第二次交易:
SQL> update t set x = 1 where y = 1;
Fired
0 rows updated.
正如您所看到的,触发器触发一次,但语句更新了0行。这是因为当Oracle发现当前正在尝试更新的行与WHERE子句条件不一致时(在第一次事务更新之后),Oracle必须重新启动DML语句。
触发引用的内容:旧值也可能导致DML重启。 你可以在Tom Kyte博客或他的教科书中找到有趣的例子。因此,您不应该依赖规则" N行已更改 - N次触发触发"总的来说。
答案 1 :(得分:0)
根据代码中的触发时间,它会触发10次,因为更新时间对每行影响一次