当我们更新10行时,行级别触发器会触发多少次

时间:2014-03-19 11:49:12

标签: oracle plsql triggers

How many times the **row level trigger**  will fire  when we update 10 rows?

假设表中有10行有行级触发器,当我们更新10行时,行级别触发器会触发多长时间?

2 个答案:

答案 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次,因为更新时间对每行影响一次