首页 > 解决方案 > 触发Oracle - 无法捕获更改表的用户信息

问题描述

我试图从任何模式中捕获在 table_name 中触发 [dml-operation] 的用户。在我编写以下代码时尝试这样做时,它捕获了错误的 osuser。

代码

 create ore replace trigger trigger_name
        after insert on table_name
        for each row
        declare
         v_username varchar2(20);
         v_osuser varchar2(20);
        begin 
        select distinct osuser, username into v_osuser, v_username from v$session where osuser in ( select sys_context('USERENV', 'os_user') from dual;
        insert into audit_table values (v_osuser, v_username);
        end;
        /

如何修改此代码以便解决/解决此问题?

注意:我在一台服务器中使用触发器,并从另一台服务器调用。有什么方法可以存储调用服务器的用户信息。目前,它正在从触发器定义的服务器返回用户信息。

谢谢你。

标签: sqloracleplsqltriggersdatabase-trigger

解决方案


使用sys_context('userenv','CURRENT_SCHEMA')andsys_context('userenv','OS_USER') 获取模式名称/操作系统用户。无需执行任何“选择”或声明任何局部变量

CREATE OR REPLACE TRIGGER trigger_name AFTER
  INSERT ON table_name
  FOR EACH ROW
BEGIN
  INSERT INTO audit_table VALUES (
  sys_context(
    'userenv','OS_USER'
  ),
  sys_context(
    'userenv','CURRENT_SCHEMA'
  )
);

END trigger_name;
/

可能值得阅读 sys_context 上的文档


推荐阅读