首页 > 解决方案 > 需要创建一个更新的触发器而不添加相同的数字

问题描述

我需要创建一个触发器,在我在表 A 中进行更新后激活,在审计日志中注册我在表 A 中更新的数字,但如果该数字已经添加(例如触发器尝试在有一个 1 已经)它必须忽略它,只让第一个。

例子:

我已经有了触发器:

CREATE OR REPLACE TRIGGER registro_aeropuerto
AFTER UPDATE ON AEROPUERTO
FOR EACH ROW
DECLARE
A INT;
B INT;
BEGIN 
A := table_A_updated_column_value;
SELECT CASE
WHEN EXISTS(SELECT * FROM Audit_log WHERE A = Coordinator)
THEN 1
ELSE 0
END INTO B FROM DUAL;
IF B = 0
THEN 
INSERT INTO Audit_log(Coodinator, Date) VALUES (A, trunc(sysdate));
END;

每当我尝试执行触发器时,它都会给我下一个错误:

符号“;” 在预期的时候被发现:

标签: oracleplsqltriggers

解决方案


示例表(upd_col_value是您正在更新的列;您将其命名为“ table_A_updated_column_value”)

SQL> create table aeropuerto (upd_col_value number);

Table created.

SQL> create table audit_log (coordinator number, datum date);

Table created.

触发器可以简化;无需声明任何其他变量,也无需先检查插入下一个;在同一个select语句中执行此操作:

SQL> create or replace trigger registro_aeropuerto
  2    after update on aeropuerto
  3    for each row
  4  begin
  5    insert into audit_log (coordinator, datum)
  6      select :new.upd_col_value, sysdate
  7      from dual
  8      where not exists (select null
  9                        from audit_log a
 10                        where a.coordinator = :new.upd_col_value
 11                       );
 12  end;
 13  /

Trigger created.

测试:

SQL> insert into aeropuerto (upd_col_value) values (1);

1 row created.

SQL> select * from audit_log;

no rows selected

日志中没有任何内容,因为没有更新任何内容。所以,让我们更新它:

SQL> update aeropuerto set upd_col_value = 5;

1 row updated.

SQL> select * from audit_log;

COORDINATOR DATUM
----------- -------------------
          5 15.09.2021 07:14:46

SQL>

好的; 日志现在包含一行。另一个更新:

SQL> update aeropuerto set upd_col_value = 6;

1 row updated.

SQL> select * from audit_log;

COORDINATOR DATUM
----------- -------------------
          5 15.09.2021 07:14:46
          6 15.09.2021 07:15:37

SQL>

正确的; 两行,因为 5 更新为 6。如果我们将 6 更新回 5 会发生什么?

SQL> update aeropuerto set upd_col_value = 5;

1 row updated.

SQL> select * from audit_log;

COORDINATOR DATUM
----------- -------------------
          5 15.09.2021 07:14:46
          6 15.09.2021 07:15:37

SQL>

没啥事儿; 行coordinator = 5已经在表中,所以没有添加新行。


推荐阅读