有没有办法获取启动用户/架构的 sys_context('USERENV', 'CURRENT_USER')

anu*_*pks 0 sql database oracle plsql oracle12c

如果我从 admin1 访问表 emp,则使用下面的函数,理想情况下它应该返回 0,这表示连接用户为“ADMIN”,但它返回 1(最终用户的连接使用 ADMINT_TEST1.emp)

即使选择audit_test1.emp(函数 check_user 在两种模式中都可用),我也希望获得 ADMIN1 用户的连接标识,例如:来自 admin1 用户

create or replace function check_user
return number
is
  n number;
begin
  SELECT sys_context('USERENV', 'CURRENT_USER') into usrname FROM dual;
  if (usrname ='AUDIT_TEST') then
    dbms_output.put_line('show user'||usrname);
    return 1;
  else 
    return 0;
  end if;
end ;
Run Code Online (Sandbox Code Playgroud)

测试功能(从用户运行:ADMIN1)

declare
  n number(1);
begin
  select audit_test.check_user into n from dual;
  dbms_output.put_line(n);
  select check_user into n from dual;
  dbms_output.put_line(n);
end;
/


Output
===============
show user   AUDIT_TEST
1
show user   ADMIN1
0
Run Code Online (Sandbox Code Playgroud)

这是预期的功能吗?即使发起用户是 ADMIN1,当我们发出 admin_test.emp(connection_identifier)时,更改为 AUDIT_TEST;

(我已经尽力表达了我想要的意思,不确定信息是否清楚,如果问题不清楚,请评论)

Wer*_*eit 5

您可以简单使用dbms_output.put_line(sys_context('USERENV', 'CURRENT_USER'));- 无需SELECT ... INTO ... FROM dual

无论如何,检查文档

CURRENT_USER

当前权限处于活动状态的数据库用户的名称。这可能会在数据库会话期间随着实时应用程序安全会话的附加或分离而发生变化,或者反映任何活动定义者权限对象的所有者。当没有定义者的权限对象处于活动状态时,CURRENT_USER 返回与 SESSION_USER 相同的值。

CURRENT_USER不是当前用户,它显示当前活动的权限。默认情况下(即定义者的权限),在过程/函数/包内,过程所有者的权限适用于当前用户。

为了得到当前用户的使用情况sys_context('USERENV', 'SESSION_USER')或者干脆就这样使用USER