【发布时间】:2011-08-19 19:07:16
【问题描述】:
在 Oracle 中,您可以通过在 CREATE TRIGGER 语句中指定 FOR EACH ROW 子句来编写行级触发器:
CREATE TRIGGER MY_FANCY_TRIGGER
BEFORE UPDATE ON MY_TABLE
FOR EACH ROW
BEGIN
IF :OLD.my_id_column > 4 AND :NEW.some_other_column <> 'foo' THEN
-- ...
END IF;
END;
这样的触发器允许您查看每个受影响行的之前和之后版本(分别为:OLD和:NEW)。例如,以下语句将导致此触发器对MY_TABLE 中的每一行执行一次:
UPDATE MY_TABLE SET some_other_column = 'bar';
通过消除FOR EACH ROW 子句,触发器变为语句 级触发器。这意味着它每条语句只执行一次,无论有多少行(如果有)受语句影响。不幸的是,语句级触发器没有可用的:OLD 和:NEW 变量(因为受影响的行数很多不同)。
是否可以在语句级触发器中获取 所有 受影响行的 :OLD 和 :NEW 值?我有一些处理,我希望每个语句只发生一次。
【问题讨论】: