这两个块之间的差异以及何时使用第一个或第二个?
Create OR Replace trigger trig_before_insert before insert on Employee For each Row
Begin
DBMS_OUTPUT.PUT_LINE('Inserting');
END;
并且
Create OR Replace trigger trig_before_insert before insert on Employee
Begin
DBMS_OUTPUT.PUT_LINE('Inserting');
END;
答案 0 :(得分:4)
如果您执行
INSERT INTO EMPLOYEE
SELECT ...
并且SELECT
返回100行,以便INSERT
插入100行,第一个触发器将执行100次,每行一次。在相同的情况下,您的第二个触发器只会执行一次。
您可以使用BEFORE INSERT...FOR EACH ROW
触发器通过:NEW
变量访问它们来更改正在插入的值。例如,
:new.column_1 := 'a different value';
你不能在语句级触发器中执行此操作(这是你的第二个触发器)。
行级触发器也有限制(这是你的第一个触发器)。特别是,您可能不会从触发器的基表SELECT
中EMPLOYEES
,因为该表被称为"变异"。根据我的理解,确切的原因可以追溯到关系数据库的核心原则 - 特别是语句的结果(如INSERT INTO...SELECT
)不应该依赖于处理行的顺序。但是,我认为这种限制的解决方法超出了原始问题的范围。