变异触发器,当我们可以从触发表中读取时,何时不是?

时间:2014-03-08 13:48:55

标签: oracle plsql triggers

我有2个触发器,它们都是行级并从触发表读取数据。我的问题是为什么其中一个(trg1)导致MUTATING触发错误而另一个(trg2)没有。为什么只有其中一个可以选择触发表?我知道自主交易的可能性。我只想了解规则何时可以从触发表中读取,何时不读取。

触发器:

CREATE OR REPLACE TRIGGER trg1
   AFTER INSERT OR UPDATE
   ON employees
   FOR EACH ROW
DECLARE
   myval   NUMBER
BEGIN
   SELECT COUNT (*)
     INTO myval
     FROM employees;
END;

CREATE OR REPLACE TRIGGER trg2
BEFORE INSERT ON tab_1
FOR EACH ROW
DECLARE
  CURSOR c IS SELECT * FROM tab_1 WHERE col_1 = :NEW.col_1;
BEGIN
  FOR i IN c LOOP
    INSERT INTO tab_2 
    VALUES (:NEW.col_1, :NEW.col_2, NULL );
  END LOOP;
END;

谢谢, Ť

1 个答案:

答案 0 :(得分:0)

行级触发器只能从表中读取

  • 如果是BEFORE INSERT触发器
  • 如果是单行操作

因此,两个触发器都会引发ORA-04091 - 只有在尝试多行INSERT时,AFTER INSERT才会引发一个BEFORE INSERT。

尝试运行此声明:

insert into tab_1(col_1, col_2) 
(select 'b', 'seven' from dual union all select 8, 'c', 'eight' from dual);

你也会得到一个ORA-04091。

有关详细信息,请参阅Database journal article on mutating tables