调用触发器后需要将单条记录插入审计 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. 如果您希望每次数据加载时插入 1 行到 table 以避免重复审计细节,请使用语句级触发器。

  2. 尽可能使用 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;