在Oracle数据库中,以下各项之间有什么区别:
用户()
sys_context('USERENV','CURRENT_USER')
sys_context('USERENV','SESSION_USER')
这些与“当前用户”是否也可能相关的值?
sys_context('USERENV','CURRENT_SCHEMA')
sys_context('USERENV','AUTHENTICATED_IDENTITY')
我特别感兴趣的是,哪些可以更改,哪些可以更改,哪些不能更改值,哪些基于连接类型具有不同的值以及哪个(一个或多个)始终是用于登录到数据库。
在我的大多数测试中,值始终是相同的。唯一的例外是运行以下命令来更改“ CURRENT_SCHEMA”时:
alter session set current_schema=<SCHEMA>
进行以下操作会导致错误:
alter session set current_user=<USER> --even as sys/system, which is good I suppose
因此,围绕这一切都有某种安全性/规则。但是,在拥有SESSION_USER和CURRENT_USER之后一定有一些原因。我还认为user()可能是sys_context('USERENV','CURRENT_USER')的快捷方式,但是我找不到有关此问题的文档。
最佳答案
从手册:http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions184.htm#SQLRF51825
当前用户
特权当前处于活动状态的数据库用户的名称。在会话持续时间内,这可能会发生变化,以反映任何活动的定义者的权限对象的所有者。当没有定义者的权限对象处于活动状态时,CURRENT_USER返回与SESSION_USER相同的值。当直接在视图定义的主体中使用时,这将返回执行使用该视图的游标的用户;它不将游标中使用的视图视为定义者的权限。
SESSION_USER
登录时数据库用户的名称。对于企业用户,返回架构。对于其他用户,返回数据库用户名。在整个会话期间,该值保持不变。
因此,SESSION_USER和CURRENT_USER之间存在差异,尤其是在存储过程或函数中使用CURRENT_USER时。
我不得不承认,我不知道“企业用户”这个术语是什么意思。
顺便说一句:还有第三个:
SESSION_USERID
登录时数据库用户的标识符。