如何登录Oracle数据库?

时间:2008-10-12 12:13:30

标签: database oracle logging

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

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

虽然可以使用此方法及时挖掘记录状态,但它有一些缺点:

  • 在原始表中引入新列不会自动涉及日志修改。
  • 日志修改会影响日志表和触发器,很容易搞砸。
  • 无法以直接的方式确定特定过去时间的记录状态。
  • ...

还有其他可能性吗? 可以使用哪种工具来解决这个问题?

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

编辑:根据Brian的回答,我发现以下reference解释了标准和细粒度审核。

5 个答案:

答案 0 :(得分:10)

听起来你在'审计'之后。 Oracle有一个名为Fine Grain Auditing(FGA)的内置功能。简而言之,您可以审核所有内容或特定条件。真正酷的是你可以'审核'选择以及交易。简单的命令来开始审核:

audit UPDATE on SCOTT.EMP by access;

将其视为select语句的“触发器”。例如,您创建策略:

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

答案 1 :(得分: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

答案 2 :(得分:1)

在类似的问题(How to Audit Database Activity without Performance and Scalability Issues?)中,接受的答案提到使用网络流量嗅探器作为一种有趣的替代方案来监控数据库流量。

答案 3 :(得分:0)

log4plsql是一个完全不同的东西,它用于记录来自PL / SQL的调试信息

根据你的需要,你需要。

  1. 设置触发器
  2. 在表格周围设置PL / SQL界面,通过此界面进行CRUD操作,界面确保日志表更新。
  3. 应用程序层中的设置界面,与PL / SQL界面一样,位于更高的位置。
  4. Oracle 11g包含版本化表,但我根本没有使用它,所以不能发表任何真正的评论。

答案 4 :(得分:0)

如果您只是想知道最近的数据是什么样的,那么您可以使用Oracles闪回查询功能来查询过去特定时间的数据。过去多远取决于您拥有多少磁盘空间以及有多少数据库活动。这个解决方案的好处是可以自动添加新列。缺点是你不能通过ddl操作闪回查询。