我正在运行Oracle 19 C,并寻找一种方法来审计给定模式的所有DDL。具体来说,我希望能够审计对模式本身的所有更改。例如创建、删除和更改表和视图,修改和/或编译函数和包,甚至截断。我对任何DML(例如插入、更新或选择)不感兴趣。我知道我可以做如下操作:
CREATE AUDIT POLICY ALTER_TABLE_POLICY
ACTIONS ALTER ON MYSCHEMA.TABLE1,
ACTIONS ALTER ON MYSCHEMA.TABLE2,
ACTIONS ALTER ON MYSCHEMA.TABLE3;
AUDIT POLICY ALTER_TABLE_POLICY;
但是这对于我想做的事情来说似乎非常乏味。更不用说,它没有考虑到创建新表。当然,有一个更好的方法来获得我想要的所有更改。
我确实在这里看到了这个主题:Oracle - Audit Trail for a specific user
但这似乎更多地是为了跟踪特定用户的所有操作。我想跟踪特定用户/模式上的操作。更不用说,当我寻找这一点时,我看到的许多结果似乎更侧重于12 c之前和更高版本的解决方案。
如何使用统一审计跟踪来审计给定模式的DDL?
2条答案
按热度按时间jgovgodb1#
您可以使用命令
ALTER SYSTEM SET enable_ddl_logging=TRUE;
将enable_ddl_logging参数设置为TRUE,从而在Oracle 19c中启用DDL日志记录不过,我相信enable_ddl_logging是一个额外的付费特性,仅适用于企业版用户。
ENABLE_DDL_LOGGING启用或禁用将数据定义语言(DDL)语句的子集写入DDL日志。
but5z9lq2#
有
enable_ddl_logging
,但它有一些问题:1.它只提供SQL,而不提供标识信息。
1.如果您的应用程序进程执行大量的截断和临时表工作,它可能会填满警报日志。
1.警报日志不是(容易)通过编程访问的。
1.只有DBA可以查看它。
1.要么全有要么全无整个数据库每一个DDL
更好的替代方法是创建一个系统触发器(
CREATE TRIGGER myschema.tr_audit_ddl AFTER DDL ON SCHEMA
)并填充您自己的自定义审计表。在此触发器中,您可以使用预定义的变量:当然,你可以从
SYS_CONTEXT/USERENV
和v$session
中提取额外的字段。你可以决定忽略哪些DDL,因为它们太频繁了。你可以控制谁可以访问这些信息,你可以保留它多长时间,等等...你甚至可以使用表驱动规则。这比其他选项要强大得多。只是要确定,就像任何系统触发器一样,捕获所有异常(
WHEN OTHERS THEN NULL
),以避免在触发器代码出现问题时中断应用程序进程。使用EXECUTE IMMEDIATE
断开日志表和引用的任何其他对象的依赖链也是明智之举,这样就可以在运行时捕获丢失的对象引用或其他解析问题,而不是阻止应用程序DDL成功的无效触发器。