【发布时间】:2022-01-19 08:52:09
【问题描述】:
CREATE TABLE trg_demo
(
e_id NUMBER(10),
e_name VARCHAR2(30),
CONSTRAINT pk_trg_demo PRIMARY KEY (e_id)
);
CREATE SEQUENCE trg_audit_sq;
CREATE TABLE trg_audit
(
a_id NUMBER(10),
modified_date TIMESTAMP,
CONSTRAINT pk_trg_audit PRIMARY KEY (a_id)
);
触发器:
CREATE OR REPLACE TRIGGER trigger_trg
BEFORE INSERT
ON trg_demo
FOR EACH ROW
BEGIN
INSERT INTO trg_audit
VALUES (trg_audit_sq.nextval, current_timestamp);
END;
INSERT INTO trg_demo VALUES (1, 'A');
INSERT INTO trg_demo VALUES (2, 'B');
预期输出:
+------+---------------+
| A_ID | MODIFIED_DATE |
+------+---------------+
| 1 | 16-12-21 |
+------+---------------+
我将在 2 天内向 trg_demo 表中插入一次行。所以,假设今天如果我插入 2 行然后在 trg_audit 表中,它将只插入今天日期的一行,然后如果我在 trg_demo 表中插入 4 行然后在 2 天后在 trg_audit 中它将有第二行,A_ID 为 2,日期为 18-12-21。
【问题讨论】:
-
select * from user_errors where type = 'TRIGGER' and name = 'trigger_trg'有什么错误? -
你的代码很好。我怀疑这可能是某种授予/许可问题。检查您的触发器是否编译正确。错误说它无效
-
@AliFidanli 谢谢触发器有错误。但我可以看到审计表中插入了两行,但我只需要插入一条记录,如原始问题所示
-
当您创建了一个行级触发器(FOR EACH ROW,对吗?),它会为您运行的每个 INSERT 语句触发。如果您运行了两次插入,则会将两行插入到日志表中。这是意料之中的,你是这样写的。也许您想切换到语句级触发器。
-
@Littlefoot感谢您的建议。如何做语句级触发?