Sql Oracle中的BEFORE INSERT触发器中每行何时不需要?

Sql Oracle中的BEFORE INSERT触发器中每行何时不需要?,sql,oracle,plsql,triggers,Sql,Oracle,Plsql,Triggers,我不熟悉Oracle中的PLSQL。当我学习触发器时,我从这个来源读到,当我在Oracle中插入触发器之前创建一个触发器时,并不总是需要每行的,因此语法用方括号括起来[]。我写了这个简单的触发器: CREATE OR REPLACE TRIGGER enroll_time BEFORE INSERT ON ENROLL FOR EACH ROW BEGIN :new.addtime := sysdate; END; / 如果我删除上面每一行的,我实际上会得到一个错误: Error repor

我不熟悉Oracle中的PLSQL。当我学习触发器时,我从这个来源读到,当我在Oracle中插入触发器之前创建一个
触发器时,并不总是需要每行
,因此语法用方括号括起来[]。我写了这个简单的触发器:

CREATE OR REPLACE TRIGGER enroll_time
BEFORE INSERT
ON ENROLL
FOR EACH ROW
BEGIN
:new.addtime := sysdate;
END;
/ 
如果我删除上面每一行的
,我实际上会得到一个错误:

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\u name]
,那么每行的
必须存在。为什么会这样?Oracle中插入触发器之前的
中是否有不需要对每行
执行
的示例

是否有任何示例表明Oracle中的BEFORE INSERT触发器中不需要对每一行执行任何操作

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

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;
/ 

我强烈建议您阅读了解每个部件何时触发。

基本上,如果您需要使用:旧的或:新的伪表,您需要一个行级触发器。语句级触发器的一个例子是,当另一个表受到影响时,将一条记录插入到一个表中

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