适用于:
Oracle Server - Enterprise Edition - Version: 9.2.0.1 and later [Release: 9.2 and later ]
Information in this document applies to any platform.
Checked for relevance on 11-Sep-2010
目的:
特别注意:
强烈建议使用DBMS_MAMT包提供的DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION方法来代替这个文档中描述的方法。
查看:note 731908.1 "New Feature DBMS_AUDIT_MGMT To Manage And Purge Audit Information",可得到更多相关的信息。也要明白移动的审计表SYS.AUD$ (or SYSTEM.AUD$ in case of OLS) 和 FGA_LOG$是被DBMS_AUDIT_MGMT所支持的。 但是这里没有给出支持在表AUD$中添加触发器。
更多的额外的特征,比如Alerts可能关于Audit Vault,并且不需要再资源数据库中使用触发器实行,但是需要使用一个被支持的产品特征。
对于这个问题的更多信息,请阅读Oracle 8i的管理指南,第24章 - “审计数据库使用”主题下的“控制审计线索的增长和规模”:
在数据库创建的数据库审计线索(SYS.AUD $表)的最大大小是预先确定的。默认情况下,高达99区段,每个10K的大小,可以分配给这个表。你不应该移动SYS.AUD $到另一个表作为审计线索的增长和规模控制的一种手段。但是,您可以修改SYS.AUD $默认的存储参数。
本文包含从SYS用户和表空间系统移动到另一个用户和表空间“SYS.AUD $”表的脚本。它还提供了一个可以添加额外的审计信息记录到结果表触发的例子。
本文分布外部由于客户的需求
运用范围:
此脚本已与Oracle8i中,Oracle9i的测试。它不支持,因为以下不支持
--走出SYSTEM表SYS.AUD $表
--移动SYS.AUD $表SYS模式
--AUD $表中添加触发器
上述不支持的原因是因为Oracle的代码数据字典表SYS.AUD $,如可能导致问题升级和备份/恢复方案的隐含假设。 “不支持”意味着,如果出现问题,因为放在AUD $表上的触发器,Oracle支持不能涉及发展。强烈建议,以寻求支持的解决方案,可以安装使用任何额外的处理,你需要一个处理函数,如细粒度审计。
Moving AUD$
Oracle 存储在一个单一的表的审计跟踪记录,“SYS.AUD $”,是一个基础数据字典表,它不支持去改变它。然而,它支持修改默认的存储参数(除初始)“SYS.AUD $”。
通过改变“SYS.AUD $”的存储参数,表中可以成长为大,你需要的,但只在SYSTEM表空间。在Oracle8i/ Oracle9i的管理员指南包含在SYSTEM表空间管理这种增长方式,但没有通过移动提供额外的灵活性“SYS.AUD $”到另一个表空间。
下面的脚本将允许您移动SYSTEM表空间,并从SYS“SYS.AUD $”表系统用户
1. Start the database with :
audit_trail=none
2. Run the following in Sqlplus:
connect sys/
create table system.aud$
tablespace
as select * from aud$;
create index system.i_aud1 on system.aud$(sessionid, ses$tid);
rename aud$ to aud$_temp;
create view aud$ as select * from system.aud$;
connect system/
grant all on aud$ to sys with grant option;
grant delete on aud$ to delete_catalog_role;
3. Re-Start the database with :
audit_trail=DB
4. Recreate the data dictionary views for auditing :
connect sys/
@%ORACLE_HOME%/rdbms/admin/cataudit.sql
Overview of adding triggers to AUD$
默认的Oracle审计纯粹的存储由用户执行的操作类型的记录;记录用户执行的动作的额外信息,它往往是有益的。
The following is a example of a trigger that could be added after the above script has been run :
create table system.accounting
(USERNAME VARCHAR2(30),
LOGIN_TIME DATE,
LOGOFF_TIME DATE,
SCHEMANAME VARCHAR2(30),
OSUSER VARCHAR2(15),
PROCESS VARCHAR2(12),
MACHINE VARCHAR2(64),
TERMINAL VARCHAR2(8),
PROGRAM VARCHAR2(64),
TYPE VARCHAR2(10),
LOGICAL_READ NUMBER,
PHYSICAL_READ NUMBER,
SID NUMBER,
SESSION_SID NUMBER,
CPU_TIME NUMBER)
tablespace
;
create or replace trigger acc_trigger
after update on system.aud$ for each row
when (new.action# = 101 or new.action# = 102)
declare
v_conc_id number;
begin
v_conc_id := 99;
insert into system.accounting
select :new.userid,
:new.timestamp#,
:new.logoff$time,
ss.schemaname,
ss.osuser,
ss.process,
ss.machine,
ss.terminal,
ss.program,
ss.type,
:new.logoff$lread,
:new.logoff$pread,
st.sid,
ss.audsid,
st.value
from V$STATNAME S, V$SESSTAT ST, V$SESSION SS
where S.STATISTIC# = ST.STATISTiC# AND ST.SID = SS.SID
and :new.sessionid = SS.AUDSID
and S.NAME='CPU used by this session';
end;
/
An example of querying the accounting table is :
select osuser,username,
to_char(LOGIN_TIME,'dd.mm.yy:hh:mi') login,
to_char(LOGOFF_TIME,'dd.mm.yy:hh:mi') logout,
MACHINE,
CPU_TIME
from accounting;