把该策略记住后,您应该创建两个不同的 FGA 策略。
首先,针对 EMPNO >= 1000、SALARY 列和 BONUS 列的通用策略。 begin
dbms_fga.add_policy (
object_schema => 'ACCMAN',
object_name => 'EMP',
policy_name => 'EMP_SEL_POL',
audit_column => 'SALARY, BONUS',
statement_types => 'SELECT');
audit_option => 'EMPNO >= 1000 and USER NOT IN(''SAP_PAYROLL_APP'', ''MONICA'', ''ADAM'')',
handler_module => 'ENQUEUE_MESSAGE'
);
end;
然后,针对 EMPNO < 1,000 创建用于全部列的策略。 begin
dbms_fga.add_policy (
object_schema => 'ACCMAN',
object_name => 'EMP',
policy_name => 'EMP_SEL_POL',
statement_types => 'SELECT');
audit_option => 'EMPNO < 1000',
handler_module => 'ENQUEUE_MESSAGE'
);
end;
第三,给 MONICA 和 ADAM 添加特殊的策略。 begin
dbms_fga.add_policy (
object_schema => 'ACCMAN',
object_name => 'EMP',
policy_name => 'EMP_SEL_POL',
audit_column => 'SALARY, BONUS',
statement_types => 'SELECT');
audit_option => 'EMPNO >= 1000 AND SAL <= 1000 and USER IN
(''MONICA'', ''ADAM'') AND USER != ''SAP_PAYROLL_APP''',
handler_module => 'ENQUEUE_MESSAGE'
);
end;
正如您所看到的,audit_option 中的条件之间是相互排斥的,所以当用户尝试执行 SELECT 语句时,只有一个策略是有效的,也只有一条记录会被写入。
您可以使用该策略构建 FGA 策略集。 然后,您可以根据需要自由地启用或禁止策略,这不会影响操作。
问题 主要有以下四个问题:
- 当选择做出之后如果处理器模块(如果定义了)抛出错误,将会在 Oracle 不同版本中引起不同的行为:
- 在 Oracle9i 数据库中,处理器模块 以无提示的方式 停止对该行进行检索,不会报错。 因此,如果有 100 行,其中 4 行满足了审计条件,处理器模块运行四次,每次都会失败。 该查询将仅仅返回 96 行,而不报告任何错误,您将绝不会知道事情已经发生了。 很显然,这种做法会产生不精确的结果。
- 在 Oracle Database 10g 第 1 版中,处理器模块将忽略处理器模块中的错误,按照预期检索所有 100 行。
- 在 Oracle Database 10g 第 2 版中,处理器模块将报告执行查询的用户会话方面的错误,而不返回任何行,甚至不返回那些不满足审计条件而没有执行处理器函数的 96 行。
所以,在实施 FGA 处理器模块之前请先对其进行全面测试。
- 审计线索表——FGA_LOG$——在系统表空间中。 当更多的 FGA 条目产生时,空间表就填满了,这可能导致数据库运行中断。
- 审计线索被写入表中,不过是以异步方式进行的。 这会产生事务处理和 I/O,它将增加到数据库中的整体 I/O 中。 如果您的数据库是受 I/O 所限,您将看到实施 FGA 处理器模块后对整个数据库的性能影响。
- 您可以使用自治事务处理以异步方式编写审计线索。 所以,即使用户回滚该事物处理,也不会删除该线索条目,导致错误的正值. 如果您想将 FGA 用作一种简单的机制来识别用户,您应该注意这些错误的正值。
(编辑:aniston)
|