在网上查询了些资料,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;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7177735/viewspace-1162087/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7177735/viewspace-1162087/

被折叠的 条评论
为什么被折叠?



