【问题标题】:Trigger Oracle - Cant capture the userinformation who change the table触发Oracle - 无法捕获更改表的用户信息
【发布时间】:2020-06-09 12:53:59
【问题描述】:

我试图从任何模式中捕获在 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;
        /

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

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

谢谢。

【问题讨论】:

  • 你应该做的。它捕获了什么,您希望它捕获什么?它是否有错误的操作系统用户、数据库用户或两者都有?如果您使用dbms_output 进行调试,您会看到什么不同吗? - 远射,但审计表上可能有触发器。你是从哪里插入的?
  • 你好@Alex Poole,谢谢你的回复,但是,我认为这不起作用,因为我在一个服务器中使用触发器,并从另一台服务器调用。有什么方法可以存储调用服务器的用户信息。目前,它正在从触发器定义的服务器返回用户信息。
  • 这是您应该在问题中包含的相当重要的信息。您是指通过数据库链接吗?
  • @Feullie'Tombee'-ksub:请编辑您的问题并详细说明所有涉及的服务器(数据库服务器、应用程序服务器、机器......)以及您想要检索的os_user
  • 是的,亚历克斯·普尔。我无法从开发服务器环境中捕获用户信息,谁在另一台服务器的表中执行 dml 操作(可以是生产环境)。

标签: sql oracle plsql triggers database-trigger


【解决方案1】:

尝试使用此代码:

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

【讨论】:

  • 您好@pifor,谢谢您的回复,但是,我认为这不起作用,因为我在一台服务器上使用触发器,并从另一台服务器调用。有什么方法可以存储调用服务器的用户信息。目前,它正在从触发器定义的服务器返回用户信息。
  • 抱歉,我不知道触发器如何使用 SYS_CONTEXT 或 V$ 视图检索另一个 Oracle 实例的信息。也许其他 Oracle 实例可以使用 DBMS_APPLICATION_INFO ?
【解决方案2】:

使用sys_context('userenv','CURRENT_SCHEMA')sys_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 的文档

【讨论】:

  • 这是什么意思?问题是什么” ?你得到什么结果?如果您能详细说明您所看到的内容,我们很乐意为您提供帮助
  • 您好@Koen Lostrie,谢谢您的回复,但是,我认为这不起作用,因为我在一台服务器上使用触发器,并从另一台服务器调用。有什么方法可以存储调用服务器的用户信息。目前,它正在从触发器定义的服务器返回用户信息。
  • 此信息不在您的原始问题中,我该如何回答?检查下面的 EdStevens 答案,我无法添加任何内容。
【解决方案3】:

当通过 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。

【讨论】:

    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    相关资源
    最近更新 更多