2008-10-12 81 views
6

我对Oracle数据库中常见的日志记录方法感兴趣。 我们的方法如下:如何登录Oracle数据库?

我们为要记录的表创建一个日志表。日志表包含原始表的所有列以及一些特殊字段,包括时间戳,修改类型(插入,更新,删除),修饰符的ID。原始表上的触发器为每次插入和删除创建一个日志行,并为修改创建两行。日志行包含原始更改之前和之后的数据。

虽然记录状态,可以及时使用这种方法开采回来,它也有一些缺点:

原始表中的一个新列的
  • 介绍并不自动包括日志修改。
  • 日志修改影响日志表和触发器,很容易搞砸。
  • 无法以直接的方式确定特定过去时间记录的状态。
  • ...

还有其他可能性吗? 什么样的工具可以用来解决这个问题?

我只知道log4plsql。这个工具的优点/缺点是什么?

编辑:基于布赖恩的答案,我发现以下reference,解释标准和罚款审计。

回答

10

听起来好像你是在'审计'之后。 Oracle有一个称为细粒度审计(FGA)的内置功能。简而言之,您可以审核所有或特定条件。真正很酷的是你可以“审核”选择以及交易。简单的命令开始审计:

audit UPDATE on SCOTT.EMP by access; 

把它看作是选择语句的“触发器”。例如,您可以创建策略:

begin 
    dbms_fga.add_policy (
     object_schema=>'BANK', 
     object_name=>'ACCOUNTS', 
     policy_name=>'ACCOUNTS_ACCESS' 
); 
end; 

已定义的策略后,当用户查询以通常的方式表,如下所示:

select * from bank.accounts; 

审计跟踪记录这个动作。您可以通过发出看到线索:

select timestamp, 
    db_user, 
    os_user, 
    object_schema, 
    object_name, 
    sql_text 
from dba_fga_audit_trail; 

TIMESTAMP DB_USER OS_USER OBJECT_ OBJECT_N SQL_TEXT 
--------- ------- ------- ------- -------- ---------------------- 
22-OCT-08 BANK ananda BANK ACCOUNTS select * from accounts 
0

log4plsql是一个完全不同的事情,从PL/SQL

其用于记录调试信息对于你想要什么,你需要或者。

  1. 设置一个触发
  2. 安装PL桌子周围/ SQL接口,CRUD操作通过这个接口发生,该接口可确保日志表更新。
  3. 在你的应用程序层设置接口,就像PL/SQL接口一样,只是更高。
  4. Oracle 11g包含版本化表格,但我完全没有使用过,所以可以不做真正的评论。
2

从你的描述来看,我想知道你真正需要的不是记录机制,而是某种表的某种历史价值。如果是这种情况,那么最好使用某种时态数据库设计(使用VALID_FROM和VALID_TO字段)。您可以使用Oracle LogMiner工具来跟踪数据库中的更改。

至于你的情况下,我宁愿保存在这种模式的变化的数据:

+----------------------------------------------------------------------------+ 
| Column Name   | Function            | 
+----------------------------------------------------------------------------+ 
| Id     | PRIMARY_KEY value of the SOURCE table    | 
| TimeStamp   | Time stamp of the action        | 
| User    | User who make the action        | 
| ActionType   | INSERT, UPDATE, or DELETE       | 
| OldValues   | All fields value from source table, seperated by '|' | 
| Newvalues   | All fields value from source table, seperated by '|' | 
+----------------------------------------------------------------------------+ 

对于这种类型的记录表格,你可以很容易地确定:

  • 历史变迁的行动的特定记录(使用Id)
  • 某个时间点的特定记录的状态

当然,这种记录方式无法轻易确定特定时间点的所有表的有效值。为此,您需要将表格设计更改为Temporal Database Design

+0

我喜欢这个设计,因为......我可以告诉你昨天发生的一切事情。我可以告诉你user_X所做的一切,从一个表。使用影子表格,您必须访问不断增长的表格来回答这些问题。 – 2008-10-14 21:01:25

+0

LogMiner对我来说看起来很有前途,但它需要创建挖掘数据库,字典和重做日志,因此需要对系统进行重新配置。 与我们上面的方法不同的是,它显示的是sql语句而不是列值。 – rics 2008-10-28 13:29:13

0

如果你只是想知道什么样的数据看起来像在最近的过去,你可以只使用甲骨文的闪回查询功能来查询数据,在过去的具体时间。过去有多远取决于您拥有多少磁盘空间以及有多少数据库活动。这个解决方案的亮点是自动添加新列。缺点是你不能闪回查询过去的ddl操作。