trigger oracle-无法捕获更改表的用户信息

ijxebb2r  于 2021-08-09  发布在  Java
关注(0)|答案(3)|浏览(346)

我试图从任何模式捕获在表\u名称中触发[dml操作]的用户。当我编写下面的代码时,它捕获了错误的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;
        /

如何修改此代码以便解决此问题?
注意:我在一台服务器上使用触发器,并从另一台服务器调用。有没有办法存储呼叫服务器的用户信息。当前,它正在从触发器定义的服务器返回用户信息。
谢谢您。

au9on6nz

au9on6nz1#

尝试使用以下代码:

select osuser, username 
from v$session 
where sid=(select sid from v$mystat where rownum=1);
e5njpo68

e5njpo682#

使用 sys_context('userenv','CURRENT_SCHEMA') 以及 sys_context('userenv','OS_USER') 获取架构名称/os用户。无需执行任何“select into”或声明任何局部变量

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\u上下文中阅读文档

6yjfywim

6yjfywim3#

当通过db链接执行操作时,“用户”是db链接中定义的用户,而不是调用db链接的用户。例如,数据库mydb

CREATE PUBLIC DATABASE LINK "MYLINK"
   CONNECT TO "SCOTT" IDENTIFIED BY "TIGER"
   USING 'YOURDB';

现在,当用户fred执行以下操作时:

select empno from emp@mylink;

然后,在数据库“yourdb”中,该操作由yourdb的用户scott执行,而不是由mydb的用户fred执行。

相关问题