Oracle使用代理用户连接时,如何获取真实用户名?
在Oracle DB中获取代理连接的真实用户名
当通过代理用户账户连接时,你之前使用的SELECT user FROM dual和SELECT username FROM user_users返回的都是当前上下文的代理用户,要获取真实用户名可以用以下两种方法:
方法1:查询V$SESSION视图
通过会话ID过滤当前会话,直接获取真实用户名和代理用户名:
SELECT username AS 真实用户名, proxy_username AS 代理用户名 FROM v$session WHERE sid = SYS_CONTEXT('USERENV', 'SID');
此查询中,username字段对应真实用户名i_am_the_true_user_name,proxy_username对应代理用户名i_am_the_proxy_user_name。
方法2:使用SYS_CONTEXT函数
利用Oracle的环境上下文函数区分会话用户与当前用户:
SELECT SYS_CONTEXT('USERENV', 'SESSION_USER') AS 真实用户名, SYS_CONTEXT('USERENV', 'CURRENT_USER') AS 代理用户名 FROM dual;
SESSION_USER:返回创建当前会话的真实用户(即你需要的i_am_the_true_user_name)CURRENT_USER:返回当前上下文的用户(代理用户i_am_the_proxy_user_name)
补充说明
你之前的查询返回代理用户名是因为:
user关键字等价于CURRENT_USER,代表当前执行上下文的用户user_users视图展示的是当前用户的自身信息,因此返回代理用户的名称
内容的提问来源于stack exchange,提问作者Kevin White
相关产品推荐
相关产品推荐

