共计 3924 个字符,预计需要花费 10 分钟才能阅读完成。
这篇文章主要为大家展示了“Oracle 中 FGA 功能怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“Oracle 中 FGA 功能怎么用”这篇文章吧。
大家对 trigger 可能比较熟悉, 但 Oracle 还有一个叫 FGA 的功能, 它的作用和 trigger 类似, 但功能更强大. 它的全称是 Fine-Grained Audit , 是 Audit 的一种特殊方式. 使用 FGA 只要调用 Oracle 的包 DBMS_FGA.ADD_POLICY 创建一些 policy(审计策略)就行. 每个 policy 只能针对一个表或视图. 建好策略后所有对表或视图的 DML 操作 (select,insert,update,delete 都可以记录到, 当然也可以添加一些筛选条件只监测某些特殊的操作.
补充: 所谓审计就是记录你的任意操作, 假如你的操作 (执行 DML 语句) 符合指定的条件, 则你执行的 sql 语句, 将被记录到 sys 用户下的一些表中, 还会将你的其他信息, 比如执行时间, 用户名, 通过什么工具, 机器名等.
FGA 在 oracle 9i 中就有了, 但在 9i 中只能审计 select 语句. 从 10g 开始才能审计所有的 DML 操作
1. 包 DBMS_FGA.ADD_POLICY 的用法
创建审计策略的语法
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 语句同时操作了这两列才被记录
举例, 假如创建表:create table temp(eno int,ename varchar2(30)); 针对这个表创建 policy
每个策略只能针对一个表或视图, 而一个表或视图可能对应多个策略. 当表被删除时策略也随之默认被删除
BEGIN
SYS.DBMS_FGA.ADD_POLICY (
object_schema = ARWEN
,object_name = TEMP
,policy_name = FGA_TEMP
,audit_condition = NULL
,audit_column = eno,ename
,handler_schema = null
,handler_module = null
,enable = TRUE
,statement_types = SELECT,INSERT,UPDATE,DELETE
,audit_trail = SYS.DBMS_FGA.DB+SYS.DBMS_FGA.EXTENDED
–DBMS_FGA.DB 表示记录将被保存到数据库中,DBMS_FGA.EXTENDED 表示如果 sql 语句中带有绑定变量也会被记录下来.
– 如果是这样选 audit_trail = SYS.DBMS_FGA.DB 表示不会记录绑定变量
–SYS.DBMS_FGA.DB+SYS.DBMS_FGA.EXTENDED 改成 SYS.DBMS_FGA.XML+SYS.DBMS_FGA.EXTENDED 表示记录保存成 xml 文件
–xml 文件所在目录可以通过 SHOW PARAMETER AUDIT_FILE_DEST 查看, 如果要更改目录 ALTER SYSTEM SET AUDIT_FILE_DEST = directory_path DEFERRED;
,audit_column_opts = SYS.DBMS_FGA.ALL_COLUMNS)
END;
查看创建好的 policy 对象和符合审计条件时被记录的操作
我们可以通过 select * from dba_objects 查看 table,view 等对象, 类似的 policy 创建好后我们可以通过 SELECT * FROM DBA_AUDIT_POLICIES 来查看.
如果我们对表 temp 执行了 DML 操作, 那些信息将会被操作到 sys 用户下的表中,Select* from sys.dba_fga_audit_trail 可以查找到.(注意这只有前面设置将记录信息
保存到数据库才能这样查, 如果保存到 xml 文件中可以 Select *from V$XML_AUDIT_TRAIL)
2. 删除审计策略, 假如删除上面创建的策略
begin
SYS.DBMS_FGA.DROP_POLICY (
object_schema = ARWEN
,object_name = TEMP
,policy_name = FGA_TEMP
);
end;
3. 使用 handler_module
假如你想在审计到某些操作时还进行进一步的处理, 比如把信息写到自己创建的日志中, 或者发送邮件通知相关人员. 就要在创建 policy 时使用 handler_module 的功能, 指定一个存储过程去做相应的处理. 假如我创建一个存储过程 temp_handler
CREATE OR REPLACE PROCEDURE temp_handler
(v_object_schema VARCHAR2
, v_object_name VARCHAR2
, v_policy_name VARCHAR2
)
IS
v_temp varchar2(30);
begin
null;
end temp_handler;
– 这里的存储过程有点特殊, 它必须带 v_object_schema VARCHAR2, v_object_name VARCHAR2, v_policy_name VARCHAR2 这三个参数才行, 如果直接写一个一般的存储过程就会出错的. 在 policy 中调用存储过程就这样 写
BEGIN
SYS.DBMS_FGA.ADD_POLICY (
object_schema = ARWEN
,object_name = TEMP
,policy_name = FGA_TEMP
,audit_condition = NULL
,audit_column = eno,ename
,handler_schema = ARWEN – 注意此处的用户只能是创建此 policy 的用户, 如果是其他用户名会出错的
,handler_module = TEMP_HANDLER
,enable = TRUE
,statement_types = SELECT,INSERT,UPDATE,DELETE
,audit_trail = SYS.DBMS_FGA.DB+SYS.DBMS_FGA.EXTENDED
,audit_column_opts = SYS.DBMS_FGA.ALL_COLUMNS)
END;
与 FGA 相关的表或者视图:
select * from fga$
select * from fga_log$
select * from fgacol$
select * from dba_fga_audit_trail
select * from dba_common_audit_trail
select * from dba_audit_policies
select * from dba_fga_audit_trail
与 FGA 相关的包或者过程:
dbms_fga.add_policy
dbms_fga.drop_policy
表、视图、包的列或者参数的使用方法,可以查看相关文档。
以上是“Oracle 中 FGA 功能怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!