之前对于oracle中v$session视图中的audsid比较疑惑,不明白它和sid的区别,后来在网上查到了一些资料,现把audsid的产生原理和含义总结如下:
首先截取一部分v$session结构
sys@ORCL> descv$session
其中的audsid由SYS.AUDSES$这个sequence产生,当有一个新的会话产生,其audsid的值即为这个sequence的nextval,是为了审计使用的产生值。
现在我们查看一下dba_sequences中的信息:
sys@ORCL> select *from dba_sequences where sequence_name = 'AUDSES$';
SEQUENCE_OWNER
------------------------------ ---------------------------------------- ---------- ------------ - - ---------- -----------
SYS
能看到AUDSES$的最大值和当前值等信息,当有用户连接时就会分给一个audsid以方便对该用户的审计。
现在来查看一下session中的内容
sys@ORCL> selectsid, serial# ,audsid ,username,OSUSER,schemaname
2 from v$session;
---------- ---------- ---------- ------------------------------------------------------------ ------------------------------
22 rows selected.
其中除了736,737等较小的值之外还有很多sys用户的4294967295值,在oracle10g及以后的版本中sys用户的audsid都统一为4294967295,多个sys同时登陆也只有这一个值。除此之外还有很多的为0的值(oracle10g以前internal用户登录其audsid也都为0),现在我们来查看一下:
sys@ORCL> selectsid, serial# ,audsid ,username,OSUSER,schemaname,program
---------- ---------- ---------- ------------------------------------------------------------ ------------------------------------------------------------------------------
18 rows selected.
从这个结果我们可以看到这些audsid为0的进程都是后台进程,没有审计的必要,所以它的值都为0.
附:
--from asktom
the audsid column is populated via a sequence and for normal
sessions is the same as "userenv('sessionid')" -- but for somebackground sessions -- it is not set
(it comes back as "0" making the view not work.
So, I'd just ignore "audsid" for now and use SID.