从 oracle 中的触发器进行审计
Auditing from a trigger in oracle
我正在使用一个大数据库,它有很多数据生成器,基本上每天都有大量数据被插入和更新。我有一个触发器,每次有更新或插入时都会更新每一行,我使用以下代码从 apex 应用程序输入人名(来自 apex 的用户)
NVL(v('APP_USER'),USER)
当有大量数据输入时,我的问题就来了,例如,一个人(John)生成了 500,000 条记录,当 john 生成此数据时,每一行都经过审核,但 john 生成了不止一个用户在 apex 应用程序中显示在审核中。
场景是约翰点击一个按钮生成数据,在审计字段中,出现了多个用户名(玛丽、约翰、彼得)
有人知道为什么会这样吗?
整个代码,很通用
TRIGGER trg_tableA before insert or update
on tableA REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
begin
:new.insert_date:=sysdate;
:new.inserted_by:= nvl(V('APP_USER'),USER);
:new.modified_date:=sysdate;
:new.modified_by:= nvl(V('APP_USER'),USER);
end trg_tableA;
提前致谢
按照这个 link 除了 V('APP_USER')
还有其他选择。从 Apex 5 开始,APP_USER
存储在 sys_context 中,这比 V() 函数性能更高。它可用 SYS_CONTEXT('APEX$SESSION','APP_USER')
.
请尝试以下操作,看看您的问题是否得到解决。
TRIGGER trg_tableA before insert or update
on tableA REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
begin
:new.insert_date:=sysdate;
:new.inserted_by:= nvl(sys_context('APEX$SESSION','APP_USER'),user);
:new.modified_date:=sysdate;
:new.modified_by:= nvl(sys_context('APEX$SESSION','APP_USER'),user);
end trg_tableA;
我正在使用一个大数据库,它有很多数据生成器,基本上每天都有大量数据被插入和更新。我有一个触发器,每次有更新或插入时都会更新每一行,我使用以下代码从 apex 应用程序输入人名(来自 apex 的用户)
NVL(v('APP_USER'),USER)
当有大量数据输入时,我的问题就来了,例如,一个人(John)生成了 500,000 条记录,当 john 生成此数据时,每一行都经过审核,但 john 生成了不止一个用户在 apex 应用程序中显示在审核中。
场景是约翰点击一个按钮生成数据,在审计字段中,出现了多个用户名(玛丽、约翰、彼得)
有人知道为什么会这样吗?
整个代码,很通用
TRIGGER trg_tableA before insert or update
on tableA REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
begin
:new.insert_date:=sysdate;
:new.inserted_by:= nvl(V('APP_USER'),USER);
:new.modified_date:=sysdate;
:new.modified_by:= nvl(V('APP_USER'),USER);
end trg_tableA;
提前致谢
按照这个 link V('APP_USER')
还有其他选择。从 Apex 5 开始,APP_USER
存储在 sys_context 中,这比 V() 函数性能更高。它可用 SYS_CONTEXT('APEX$SESSION','APP_USER')
.
请尝试以下操作,看看您的问题是否得到解决。
TRIGGER trg_tableA before insert or update
on tableA REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
begin
:new.insert_date:=sysdate;
:new.inserted_by:= nvl(sys_context('APEX$SESSION','APP_USER'),user);
:new.modified_date:=sysdate;
:new.modified_by:= nvl(sys_context('APEX$SESSION','APP_USER'),user);
end trg_tableA;