Home > TSOP > ABOUT SYS_CONTEXT

ABOUT SYS_CONTEXT

SYS_CONTEXT函数可以用来查询当前用户的信息,这些信息都是存在用户的namespace当中,我们最常用的namespace就是USERENV了。
用法也很简单,例如要查询当前登录的用户会话(session):

SQL> col sname for a10
SQL> select sys_context('userenv','session_user') sname from dual;

SNAME
----------
SYS

SYS_CONTEXT的前生是USERENV函数,现在还是可以用的,但能查的东西没有sys_context多:

SQL> select userenv('ISDBA') from dual;

USEREN
------
TRUE

USERENV空间包含的信息很多,列举几个平时对我们来说比较有用的信息:

Parameter Return Value
AUTHENTICATION_TYPE 用户的验证方法,比如常见的通过tnsnames连上来的用户就是DATABASE验证,未通过listener的本地连接用户就是OS验证
CURRENT_SCHEMA 当前schema名字,默认的话跟session名字是一样的,除非你用alter session set current_schema切换了用户的schema
CURRENT_SCHEMAID 当前schema的id,即该schema的dba_users.USER_ID,sys.user$.user#
CURRENT_USER 当前的 user,注意跟schema的区别,貌似会受执行环境的影响,跟session_user还是有区别的,虽然一般情况下一样。
CURRENT_USERID 当前user的id,即该user的dba_users.USER_ID,sys.user$.user#,同上
HOST 客户端名
IP_ADDRESS 客户端IP,我的测试结果是只有通过listener的连接才会有ip信息,本地连接为空
ISDBA 是否具有DBA权限
INSTANCE 返回instance number,这个在RAC环境下有点用,单实例没什么意义
SESSIONID audit用的id,跟v$session.AUDSID一样
SESSION_USER 登录的用户名
SESSION_USERID 登录的用户ID,dba_users.user_id
SID 当前v$session.sid

通过这些信息可以自己写个after logon on database trigger来实现想要的审计功能,或者限制某些用户登录的功能。

此外,我们自己也可以通过dbms_session.set_context过程来增加一些namespace以及相应的parameter+value,然后通过sys_context展示。目前感觉不到这东西意义何在。。

REF:

SYS_CONTEXT(ONLINE DOC)
SYS_CONTEXT(PSOUG)
USERENV vs. SYS_CONTEXT

Categories: TSOP Tags:
  1. No comments yet.
  1. No trackbacks yet.