Chinaunix首页 | 论坛 | 博客
  • 博客访问: 897076
  • 博文数量: 101
  • 博客积分: 2256
  • 博客等级: 大尉
  • 技术积分: 1481
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-19 17:52
文章存档

2017年(1)

2013年(2)

2012年(25)

2011年(73)

分类: Oracle

2013-01-11 16:41:07

1.       实验环境

1.1笔记本电脑,windows xp系统

1.2 oracle10g 32位,非归档模式;

 

2.       步骤

2.1开启数据库的审计功能

C:\Documents and Settings\Administrator>sqlplus /nolog

 

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 1 11 15:31:35 2013

 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

SQL> conn / as sysdba

已连接。

SQL> show parameter audit;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

audit_file_dest                      string      E:\ORACLE\PRODUCT\10.2.0\ADMIN

                                                 \SNAPALL\ADUMP

audit_sys_operations                 boolean     FALSE

audit_trail                          string      NONE

SQL> --发现目前是未开启状态

SQL> alter system set audit_sys_operations=TRUE scope=spfile;

 

系统已更改。

 

SQL> alter system set audit_trail=db,extended scope=spfile;

 

系统已更改。

 

SQL> --开启审计需要重启实例;

SQL> shutdown immediate;

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup

ORACLE 例程已经启动。

 

Total System Global Area  612368384 bytes

Fixed Size                  1250428 bytes

Variable Size             180358020 bytes

Database Buffers          423624704 bytes

Redo Buffers                7135232 bytes

数据库装载完毕。

数据库已经打开。

SQL> show parameter audit;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

audit_file_dest                      string      E:\ORACLE\PRODUCT\10.2.0\ADMIN

                                                 \SNAPALL\ADUMP

audit_sys_operations                 boolean     TRUE

audit_trail                          string      DB, EXTENDED

SQL> --确认已经开启审计;

 

2.2创建测试表;

C:\Documents and Settings\Administrator>sqlplus /nolog

 

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 1 11 15:39:29 2013

 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

SQL> conn baokang/shbk;

已连接。

SQL> create table test111(id number(10),name varchar2(40),bir date);

 

表已创建。

 

SQL> desc test111;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 ID                                                 NUMBER(10)

 NAME                                               VARCHAR2(40)

 BIR                                                DATE

 

SQL> insert into test111 values(1,'jacky',to_date('1981-01-01','yyyy-mm-dd'));

 

已创建 1 行。

 

SQL> insert into test111 values(2,'jacky2',to_date('1982-01-01','yyyy-mm-dd'));

 

已创建 1 行。

 

SQL> insert into test111 values(3,'jacky3',to_date('1983-01-01','yyyy-mm-dd'));

 

已创建 1 行。

 

SQL> commit;

 

提交完成。

 

SQL> select * from test111;

 

        ID NAME                                     BIR

---------- ---------------------------------------- --------------

         1 jacky                                    01-1 -81

         2 jacky2                                   01-1 -82

         3 jacky3                                   01-1 -83

 

SQL>--创建测试表完成;

 

2.3创建存储过程

 

create or replace procedure deldata

as

begin

delete  from test111 t where t.id=1;

commit;

end;

/

这个存储过程是删除表TEST111中的ID=1的那一行记录;

 

2.4对表TEST111进行审计,然后再执行存储过程,看在这种情况下是否审计有效!

 

SQL> select * from test111;
 
         ID NAME                                     BIR
----------- ---------------------------------------- -----------
          1 jacky                                    1981-1-1
          2 jacky2                                   1982-1-1
          3 jacky3                                   1983-1-1
 
SQL> --测试表中目前3条数据;
SQL> --baokang用户是有DBA权限的用户,可以审计和看些审计视图;
SQL> audit delete on test111 by access;
 
Audit succeeded
 
SQL> select * from dba_audit_trail;
SQL> --现在没有任何审计信息,按照一般理解,假如有delete语句对test111进行删除操作,肯定会有审计信息,
SQL> --现在在这个会话中,我手动删除一条记录,看是否会有审计信息;
SQL> delete from test111 where id=3;
 
1 row deleted
 
SQL> commit;
 
Commit complete
 
SQL> --现在看下审计信息;
 
SQL> --有了一条,为了确认是我刚刚的操作产生的审计信息,将sql_text字段单独拿出来;
SQL> select sql_text from dba_audit_trail;
 
SQL_TEXT
--------------------------------------------------------------------------------
 
delete from test111 where id=3
 
SQL> --确认是刚刚的操作语句;
SQL> --我们来查询下表数据;
SQL> select * from test111;
 
         ID NAME                                     BIR
----------- ---------------------------------------- -----------
          1 jacky                                    1981-1-1
          2 jacky2                                   1982-1-1
 
SQL> --开始执行存储过程(关键一步);
SQL> exec deldata;
 
PL/SQL procedure successfully completed
 
SQL> --执行成功,现在我们先看下数据,是否ID=1的已经被删除;
SQL> select * from test111;
 
         ID NAME                                     BIR
----------- ---------------------------------------- -----------
          2 jacky2                                   1982-1-1
 
SQL> --OK,确认已经删除;然后我们去看审计表里面是否有对应的审计信息;

SQL> --发现有2条数据,进一步看sql_text的内容;
SQL> select sql_text from dba_audit_trail;
 
SQL_TEXT
--------------------------------------------------------------------------------
 
delete from test111 where id=3
 
DELETE FROM TEST111 T WHERE T.ID=1
 
SQL> --发现oracle对存储过程中的delete语句也是有审计作用的;
SQL> --开始我是怀疑这个结果,现在相信了!
2.5确认是否数据库重启后,审计依然有效;
SQL> conn / as sysdba
已连接。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             188746628 bytes
Database Buffers          415236096 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。
数据库已经打开。
SQL> conn baokang/shbk;
已连接。
SQL> select * from test111;
        ID NAME                                     BIR
---------- ---------------------------------------- --------------
         2 jacky2                                   01-1月 -82
SQL> select sql_text from dba_audit_trail;
SQL_TEXT
--------------------------------------------------------------------------------
delete from test111 where id=3
DELETE FROM TEST111 T WHERE T.ID=1
SQL> --和之前一样共2条记录;
SQL> insert into test111 values(4,'jacky4',to_date('1984-01-01','yyyy-mm-dd'));
已创建 1 行。
SQL> insert into test111 values(1,'jacky5',to_date('1985-01-01','yyyy-mm-dd'));
已创建 1 行。
SQL> commit;
提交完成。
SQL> delete from test111 where id=4;
已删除 1 行。
SQL> commit;
提交完成。
SQL> select sql_text from dba_audit_trail;
SQL_TEXT
--------------------------------------------------------------------------------
delete from test111 where id=3
DELETE FROM TEST111 T WHERE T.ID=1
delete from test111 where id=4
SQL> exec deldata;
PL/SQL 过程已成功完成。
SQL> select sql_text from dba_audit_trail;
SQL_TEXT
--------------------------------------------------------------------------------
delete from test111 where id=3
DELETE FROM TEST111 T WHERE T.ID=1
delete from test111 where id=4
DELETE FROM TEST111 T WHERE T.ID=1
SQL> --确认,即使重启数据库后,审计依然有效;
阅读(3970) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

zengmuansha2015-10-29 14:25:32

请问下 你如何确定 哪条审计的SQL语句是 直接执行的SQL语句,哪条是存储过程中执行的? 除了根据终端信息外,假如一个正常的生产系统 里面开启了对某个表的审计,有很多存储过程会对该表进行DML
请问如何在审计里面显示出是哪个存储过程执行的呢?