Oracle中FGA功能怎么用

62次阅读
没有评论

共计 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 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-17发表,共计3924字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)