在ORACLE8i. 9i版本建立审计触发器

 

在网上查询了些资料,10G之前的版本,系统自带的审计功能和细粒度审计,结果都不如意,只能查询到发生了什么操作,但无法获得谁执行了操作,前值后值等详细信息。尽管不愿意,但是建立触发器来监控相关的操作还是唯一可行的办法。

首先建立一个序列,供日志表生成ID用:

-- Create sequence

--drop sequence test.t_log_seq;

create sequence test.t_log_seq

minvalue 1

maxvalue 9999999999

start with 1

increment by 1

cache 30

cycle;

其次,创建需要的日志基表:

--to create table

--drop table test.t_log;

create table test.t_log(

id    number,

Czybm                   VARCHAR2(20),  --操作员编码

Czymc                   VARCHAR2(60),  --操作员名称

ssdw                    VARCHAR2(40),  --所属单位

ssdwmc                  VARCHAR2(200), --所属单位名称

xzdw                    VARCHAR2(40),   --选择单位

xzdwmc                  VARCHAR2(200), --选择单位名称

Role                    VARCHAR2(25),   --拥有的角色  

Username                VARCHAR2(40),  --数据库用户名

osuser                  VARCHAR2(40),  --操作系统用户名

IP                      VARCHAR2(40),   --ip

Terminal                VARCHAR2(40),  --登陆机器

Module                  VARCHAR2(40),  --模块名称

App                     VARCHAR2(40),   --应用名称

CURRTIME                DATE,           --当前时间

Sid                     number,          --sid

Serial                  number,         --serial

sid_ACTION              VARCHAR2(32),   --当前session的动作

status                  VARCHAR2(10),    --当前session状态

sqlid                   varchar2(13),    --执行的SQL 语句SQLID

sql_hash                number,           --执行的SQL 语句HASH值

Sql_text                VARCHAR2(2000),  --执行的SQL 语句文本

Old_sl                  number,  --SL  旧值

New_sl                  number   --SL  新值

);

第三 授予权限:

SQL〉Conn / as sysdba;

SQL>grant select any dictionary to test;

第四:触发器具体内容如下:

--需要授予权限 grant select any dictionary to test; 否则无法访问系统字典

create or replace trigger tri_t_log

before update on t

for each row

 declare

    ls_ip varchar2(20);

    ls_user varchar2(20);

    ls_currtime date;

    ls_czy varchar2(20);

    ls_ssdw varchar2(20);

    ls_ssdwmc varchar2(20);

    ls_xzdw varchar2(20);

    ls_xzdwmc varchar2(20);

    ls_czymc varchar2(20);

    ls_role varchar2(20);

    ls_sid    number;

    ls_serial number;

    ls_program varchar2(40);

    ls_module varchar2(40);

    ls_sqltext varchar2(2000);

    ls_terminal varchar2(60);

    ls_osuser  varchar2(30);

    ls_host    varchar2(60);

    ls_sqlid   varchar2(60);

    ls_sqlhash  number;

    ls_id number;

    ls_status varchar2(10);

    ls_action varchar2(40);

   begin

      --取得当前时间和序列号

      select sysdate,t_log_seq.nextval into ls_currtime,ls_id from dual;

      --取得ip 机器名等当前系统变量

      select sys_context('userenv','ip_address'),sys_context('userenv','SESSION_USER')

          ,sys_context('userenv','terminal')--,sys_context('userenv','SESSIONID')  =V$SESSION 中的Auditing session ID

          --sessionid:the auditing session identifier.不能在分布式SQL语句上面使用该选项

          ,sys_context('userenv','os_user'),sys_context('userenv','HOST')          

      into ls_ip,ls_user,ls_terminal,ls_osuser,ls_host

     from dual;

     --取得当前SESSION号

     SELECT SID into ls_sid FROM V$MYSTAT WHERE ROWNUM =1;

    --从应用的系统设置表中取得操作员,角色等信息

    select czybm,ssdw,ssdwmc,xzdw,xzdwmc,sscj into ls_czy,ls_ssdw,ls_ssdwmc,ls_xzdw,ls_xzdwmc,ls_role from v_login ;

    --IF SQL%NOTFOUND THEN

    --取得操作员名称

    select czymc into ls_czymc from t_operator where czybm=ls_czy;

    --从系统表中取得serial# 程序 模块等

    select serial#,program,module,sql_hash_value,sql_id,status,action

      into ls_serial,ls_program,ls_module,ls_sqlhash,ls_sqlid,ls_status,ls_action

      from v$session

     where sid=ls_sid;

    --取得当前SQL_TEXT

    select sql_text into ls_sqltext from v$sql where hash_value=ls_sqlhash;   

 

    insert into t_log(id,czybm,czymc,ssdw,ssdwmc,xzdw,xzdwmc,role,username,osuser,ip,terminal,module,app

                                  ,currtime,sid,serial,sqlid,sql_hash,sql_text,old_sl,new_sl,status,sid_action)

                            values(ls_id,ls_czy,ls_czymc,ls_ssdw,ls_ssdwmc,ls_xzdw,ls_xzdwmc,ls_role,ls_user,ls_osuser

                                  ,ls_ip,ls_terminal,ls_module,ls_program

                                  ,ls_currtime,ls_sid,ls_serial,ls_sqlid,ls_sqlhash,ls_sqltext,:old.sl,:new.sl,ls_status,ls_action);         

   end; --tri_t_log;

   /

  show errors

第五:结果展示:

Select * from t_log;
bb

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7177735/viewspace-1162087/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7177735/viewspace-1162087/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值