【问题标题】:When is FOR EACH ROW not needed in a BEFORE INSERT TRIGGER in Oracle?Oracle 中的 BEFORE INSERT TRIGGER 何时不需要 FOR EACH ROW?
【发布时间】:2018-04-05 13:56:34
【问题描述】:

我是 Oracle 中 PLSQL 的新手。当我学习触发器时,我从这个来源https://www.techonthenet.com/oracle/triggers/before_insert.php 中读到,它说当我在Oracle 中创建BEFORE INSERT 触发器时,并不总是需要FOR EACH ROW,因此语法用方括号[] 括起来。我写了这个简单的触发器:

CREATE OR REPLACE TRIGGER enroll_time
BEFORE INSERT
ON ENROLL
FOR EACH ROW
BEGIN
:new.addtime := sysdate;
END;
/ 

如果我删除上面的FOR EACH ROW,我实际上会得到一个错误:

Error report -
ORA-04082: NEW or OLD references not allowed in table level triggers
04082. 00000 -  "NEW or OLD references not allowed in table level triggers"
*Cause:    The trigger is accessing "new" or "old" values in a table trigger.
*Action:   Remove any new or old references.

从错误信息看来,如果我使用:new.[column_name],那么FOR EACH ROW 必须存在。为什么是这样?是否有任何示例表明 Oracle 中的 BEFORE INSERT TRIGGER 不需要 FOR EACH ROW

【问题讨论】:

  • 创建一个只引发异常的触发器 - 防止将数据插入到表中。

标签: sql oracle plsql triggers


【解决方案1】:

在 Oracle 的 BEFORE INSERT TRIGGER 中有没有 FOR EACH ROW 不需要的示例?

语句级触发器的简单示例:

CREATE TABLE test_table(col VARCHAR2(10));

CREATE OR REPLACE TRIGGER enroll_time
BEFORE INSERT
ON ENROLL
BEGIN
   INSERT INTO test_table(col)
   SELECT 1 FROM dual;
END;
/ 

我强烈建议阅读compound trigger 以了解每个部分的触发时间。

【讨论】:

    【解决方案2】:

    基本上,如果您需要使用 :OLD 或 :NEW 伪表,则需要行级触发器。语句级触发器的一个示例是在另一个表生效时将一条记录插入到一​​个表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-13
      • 2011-03-16
      • 2017-03-24
      • 2011-09-18
      • 2022-06-11
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多