在11.2中,Oracle对于AUDIT语句进行了增强。
这一篇介绍将AUDIT的IN SESSION CURRENT语句。
在11.2中,AUDIT增加了IN SESSION CURRENT语句,可以只审计当前的会话。这对于检查当前会话执行了那么操作十分有帮助。
SQL> SELECT * FROM V$VERSION;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
SQL> SHOW USER
USER为"YANGTK"
下面在另一个会话中创建表:
SQL> SET SQLP 'SQL2> '
SQL2> SHOW USER
USER为"TEST"
SQL2> CREATE TABLE T_AUDIT1 (ID NUMBER);
表已创建。
在会话1中检查AUD$记录:
SQL> SELECT SESSIONID, OBJ$CREATOR, OBJ$NAME
2 FROM SYS.AUD$
3 WHERE NTIMESTAMP# >= TRUNC(SYSDATE);
未选定行
没有检查到任何记录,这是因为AUDIT选项并没有打开,在会话1打开AUDIT CREATE TABLE:
SQL> AUDIT CREATE TABLE;
审计已成功。
在会话2上再次建表:
SQL2> CREATE TABLE T_AUDIT2 (ID NUMBER);
表已创建。
再次检查AUDIT记录:
SQL> SELECT SESSIONID, OBJ$CREATOR, OBJ$NAME
2 FROM SYS.AUD$
3 WHERE NTIMESTAMP# >= TRUNC(SYSDATE);
未选定行
仍然没有记录,这是因为AUDIT对于当前已经连接的会话不生效,只有重新连接的会话才有效:
SQL2> CONN TEST/TEST已连接。SQL2> CREATE TABLE T_AUDIT3 (ID NUMBER);
表已创建。
在会话1中检查AUDIT记录:
SQL> SELECT SESSIONID, OBJ$CREATOR, OBJ$NAME
2 FROM SYS.AUD$
3 WHERE NTIMESTAMP# >= TRUNC(SYSDATE);
SESSIONID OBJ$CREATOR OBJ$NAME
---------- ------------------------------ ------------------------------
94943
94946
94946 TEST T_AUDIT3
现在AUDIT记录中包含了3条记录,前面两条分别是会话断开和会话登陆的AUDIT记录,最后一条就是CREATE TABLE产生的审计记录。
SQL> NOAUDIT CREATE TABLE;
审计未成功。
SQL> AUDIT CREATE TABLE IN SESSION CURRENT;
审计已成功。
关闭CREATE TABLE的审计,设置当前会话的CREATE TABLE审计。
SQL2> CONN TEST/TEST已连接。SQL2> CREATE TABLE T_AUDIT4 (ID NUMBER);
表已创建。
在会话2上重新登陆,并建表。
SQL> SELECT SESSIONID, OBJ$CREATOR, OBJ$NAME
2 FROM SYS.AUD$
3 WHERE NTIMESTAMP# >= TRUNC(SYSDATE);
SESSIONID OBJ$CREATOR OBJ$NAME
---------- ------------------------------ ------------------------------
94943
94946
94946 TEST T_AUDIT3
94941
94941
94941
94941
94946
94950
已选择9行。
可以看到会话2上的CREATE TABLE并未被审计,下面在当前会话执行CREATE TABLE:
SQL> CREATE TABLE T_AUDIT (ID NUMBER);
表已创建。
SQL> SELECT SESSIONID, OBJ$CREATOR, OBJ$NAME
2 FROM SYS.AUD$
3 WHERE NTIMESTAMP# >= TRUNC(SYSDATE);
SESSIONID OBJ$CREATOR OBJ$NAME
---------- ------------------------------ ------------------------------
94943
94946
94946 TEST T_AUDIT3
94941
94941
94941
94941
94946
94950
94941 YANGTK T_AUDIT
已选择10行。
使用了IN SESSION CURRENT语句,使得审计马上对当前会话生效,而不会对其他的会话进行审计。