从 oracle 中的触发器进行审计

Posted

技术标签:

【中文标题】从 oracle 中的触发器进行审计【英文标题】:Auditing from a trigger in oracle 【发布时间】:2021-04-13 14:58:41 【问题描述】:

我正在使用一个大型数据库,它有许多数据生成器,基本上每天都会插入和更新大量数据。我有一个触发器,每次更新或插入时都会更新每一行,我使用以下代码从 apex 应用程序输入人名(来自 apex 的用户)

NVL(v('APP_USER'),USER)

当有大量数据输入时,我的问题出现了,例如,一个人 (John) 正在生成 500,000 条记录,当 john 生成此数据时,每一行都经过审计,但由于 john 生成了多个用户***应用程序出现在审核中。

所以场景是 john 单击一个按钮以生成数据,并且在审计字段中,显示了多个用户名(Mary、John、Peter)

有人知道为什么会这样吗?

整个代码,很通用

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;

提前谢谢你

【问题讨论】:

也许是因为 Mary 和 Peter 也修改了其中的一些行? 没有看到实际执行的代码,其他人很难理解发生了什么。你能分享一些生成审计行的代码吗? @Littlefoot 不,没有为他们指定行。只有生成的人,他们的名字应该出现 @EJEgyed 我添加了代码,它非常通用 然后从触发器中删除or update。因为,John 可能正在“生成”(插入)行,但如果 Mary 或 Peter 更新其中一些,他们的名称将存储在审计列中。 【参考方案1】:

根据此链接Use v('APP_USER') as default value for column in Oracle Apex 除了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;

【讨论】:

使用SYS_CONTEXT 的另一种替代方法是使用全局变量apex_application.g_user。这完全消除了对函数调用的需要。 感谢您的回复,我会尝试并更新你们

以上是关于从 oracle 中的触发器进行审计的主要内容,如果未能解决你的问题,请参考以下文章

oracle12c 中的审计触发器正在编译错误

特定表的 Oracle 11g 审计跟踪

重命名时的 Oracle 12C 审计触发器

使用 oracle 触发器审计 50 列

使用 oracle 触发器审计 50 列

基本 Oracle 触发器审计表