前面对audit有详细的记录:下面是在机器上做的例子:
普通audit
audit insert,update,delete on scheam.tables by access whenever successful;
by
access/bysession:
byaccess每一个被审计的操作都会生成一条audittrail。
bysession一个会话里面同类型的操作只会生成一条audittrail,默认为bysession。
whenever[not]successful:
wheneversuccessful操作成功(dba_audit_trail中returncode字段为0)才审计,
whenevernotsuccessful反之。省略该子句的话,不管操作成功与否都会审计。
FGA
创建审计策略的语法
DBMS_FGA.ADD_POLICY (
object_schema VARCHAR2, --schema的名字,表或视图的拥有者
object_name VARCHAR2, --对象名,表或视图的名字
policy_name VARCHAR2, --审计策略名字,它和数据库中其他对象一样,需要有一个不重复,唯一的名字
audit_condition VARCHAR2, --筛选条件比如可以选择哪些符合条件的操作被记录
audit_column VARCHAR2, --表中的某一列,可以只记录对表中某一列的操作.如果不指定表示审计所有的列
handler_schema VARCHAR2, --是下面的handler_module的拥有者,其实也只能是创建policy的用户,而上面的object_schema可以是任意用户
handler_module VARCHAR2,--可以是一个一个存储过程或函数,但监测到任何一条符合条件的操作时执行它.
enable BOOLEAN, --true
或false表示policy是开启或关闭状态,如果是false表示不进行审计
statement_types VARCHAR2, --表示哪些操作将被审计,可以填上select,insert,update,delete中的一个或几个
audit_trail BINARY_INTEGER IN
DEFAULT,--有参数db,xml表示审计到的信息保存到数据库中或是以xml文件形式保存到磁盘上
audit_column_opts BINARY_INTEGER IN DEFAULT);
--这个选项其实只有在audt_column中指定了某列时才起作用.它有any_columns,all_columns两个选项假如表中有
eno,ename两列,并在audit_column中指定了这两列,那么选any_columns表示只要操作其中的任意一列都将被记录,而这里指定
all_columns的话是说只有一个sql语句同时操作了这两列才被记录
sys用户登录,创建一个审计,记录到数据库
-- 记录到db
begin
dbms_fga.add_policy(
object_schema=>'MY_TEST',
object_name=>'T_ACCOUNTS',
policy_name=>'ACCOUNTS_ACCESS',
audit_column =>
'BALANCE',
audit_condition
=> 'BALANCE>10000',
enable =>
true,
statement_types
=> 'select,insert,update,delete',
audit_trail =>
SYS.DBMS_FGA.DB+SYS.DBMS_FGA.EXTENDED);
end;
-- 记录到xml
begin
dbms_fga.add_policy(
object_schema=>'MY_TEST',
object_name=>'T_ACCOUNTS',
policy_name=>'ACCOUNTS_ACCESS',
audit_column =>
'BALANCE',
audit_condition
=> 'BALANCE>10000',
enable =>
true,
statement_types
=> 'select,insert,update,delete',
audit_trail =>
SYS.DBMS_FGA.XML+SYS.DBMS_FGA.EXTENDED);
end;
-- 带处理过程的审计
begin
dbms_fga.add_policy(
object_schema
=> 'MY_TEST',
object_name =>
'T_ACCOUNTS',
policy_name =>
'ACCOUNTS_ACCESS',
audit_condition
=> 'BALANCE>20000',
audit_column =>
'BALANCE',
handler_schema
=> 'MY_TEST',
handler_module
=> 'PRO_ACCOUNTS_HALDER',
enable =>
TRUE,
statement_types
=> 'insert,update,delete',
audit_trail =>
SYS.DBMS_FGA.DB+SYS.DBMS_FGA.EXTENDED);
end;
-- 删除审计
begin
dbms_fga.drop_policy(object_schema=>'MY_TEST',object_name=>'T_ACCOUNTS',policy_name=>'ACCOUNTS_ACCESS');
end;
-- 审计查询表
SELECT * FROM DBA_FGA_AUDIT_TRAIL
-- 删除表自动删除
select * from dba_audit_policies
MY_TEST用户登录
create table t_accounts(id number(10),name varchar2(20),balance
float)
--创建的过程
create or replace procedure pro_accounts_halder(v_object_scheam
varchar2,v_object_name varchar2,v_policy_name varchar2)
as
begin
insert into logs values
(v_object_scheam,v_object_name,v_policy_name);
--commit;(不能commit,前面有介绍)end;
--这里的存储过程有点特殊,它必须带v_object_schema
VARCHAR2, v_object_name VARCHAR2, v_policy_name
VARCHAR2这三个参数才行,如果直接写一个一般的存储过程就会出错
注:sys用户执行的操作不做审计。