2008-10-12 76 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操作。