调用触发器后需要将单条记录插入审计 table
Need to insert single record into the audit table after trigger is called
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 |
+------+---------------+
我将在 trg_demo
table 中每 2 天插入一次行。因此,假设今天如果我插入 2 行然后在 trg_audit
table 中,它将只插入一行包含今天的日期,然后在 2 天后如果我将 4 行插入 trg_demo
table 然后在 trg_audit
中会有第二行 A_ID 作为 2 和日期作为 18-12-21
.
您可以在触发器中使用条件来防止剩余并只接受一条记录:
CREATE OR REPLACE TRIGGER trigger_trg
BEFORE INSERT
ON trg_demo
FOR EACH ROW
declare
flag number;
BEGIN
select count(*) into flag from trg_audit d where trunc(d.modified_date) = trunc(sysdate) ;
if flag < 1 then
INSERT INTO trg_audit
VALUES (trg_audit_sq.nextval, current_timestamp);
end if ;
END;
请注意,虽然触发器可以将数据添加到审计中 table,但请确保对正在使用的触发器进行 2 次更新 -
如果您希望每次数据加载时插入 1 行到 table 以避免重复审计细节,请使用语句级触发器。
尽可能使用 AFTER insert,因为了解插入是否发生的真正方法是在插入后触发它,以防万一由于数据约束要求导致插入实际失败,除非,您的要求是跟踪对特定 table.
的 evert 插入尝试
创建或替换触发器customers_credit_trg
AFTER INSERT ON trg_demo
FOR EACH ROW
BEGIN
INSERT INTO trg_audit VALUES (trg_audit_sq.nextval,
current_timestamp);
END;
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 |
+------+---------------+
我将在 trg_demo
table 中每 2 天插入一次行。因此,假设今天如果我插入 2 行然后在 trg_audit
table 中,它将只插入一行包含今天的日期,然后在 2 天后如果我将 4 行插入 trg_demo
table 然后在 trg_audit
中会有第二行 A_ID 作为 2 和日期作为 18-12-21
.
您可以在触发器中使用条件来防止剩余并只接受一条记录:
CREATE OR REPLACE TRIGGER trigger_trg
BEFORE INSERT
ON trg_demo
FOR EACH ROW
declare
flag number;
BEGIN
select count(*) into flag from trg_audit d where trunc(d.modified_date) = trunc(sysdate) ;
if flag < 1 then
INSERT INTO trg_audit
VALUES (trg_audit_sq.nextval, current_timestamp);
end if ;
END;
请注意,虽然触发器可以将数据添加到审计中 table,但请确保对正在使用的触发器进行 2 次更新 -
如果您希望每次数据加载时插入 1 行到 table 以避免重复审计细节,请使用语句级触发器。
尽可能使用 AFTER insert,因为了解插入是否发生的真正方法是在插入后触发它,以防万一由于数据约束要求导致插入实际失败,除非,您的要求是跟踪对特定 table.
的 evert 插入尝试创建或替换触发器customers_credit_trg
AFTER INSERT ON trg_demo FOR EACH ROW BEGIN INSERT INTO trg_audit VALUES (trg_audit_sq.nextval, current_timestamp); END;