0

我正在使用一个大型数据库,它有许多数据生成器,基本上每天都会插入和更新大量数据。我有一个触发器,每次有更新或插入时都会更新每一行,我使用以下代码从 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;

先感谢您

4

1 回答 1

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;
于 2021-04-13T17:34:19.040 回答