oracle - 需要创建一个更新的触发器而不添加相同的数字
问题描述
我需要创建一个触发器,在我在表 A 中进行更新后激活,在审计日志中注册我在表 A 中更新的数字,但如果该数字已经添加(例如触发器尝试在有一个 1 已经)它必须忽略它,只让第一个。
例子:
- 表 A 更新为 5,5,6,8,4,4
- 那么审计日志一定要保存5,6,8,4
我已经有了触发器:
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;
每当我尝试执行触发器时,它都会给我下一个错误:
符号“;” 在预期的时候被发现:
解决方案
示例表(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
已经在表中,所以没有添加新行。
推荐阅读
- r - bigstatsr 的 FBM() 在使用并行 foreach 时无法正确计算矩阵,就像代码在简单的 for 循环中运行时一样
- javascript - 如何根据 lastFocusedWindow 对 getAllwindows 的结果进行排序?
- c# - 动态访问实体框架 DbSet
- java - synchronized(){} 的异步(非阻塞)版本
- fullcalendar - 如何使用 fullcalendar v4 将事件保存在数据库中
- laravel - Laravel 在分页结果中附加值
- sql - Sqlite 第二个日期大于第一个日期
- c# - Botframework v4:弹出窗口
- ios - 如何在相机胶卷的特定位置插入新创建的 PHAsset?
- html - BeautifulSoup 不读取请求获得的“完整”HTML