Oracle

觸發器的替代方案

  • February 27, 2020

我正在開發一個 oracle 數據庫,並希望記錄架構中特定表上發生的任何事務的確切時間。在該表上使用觸發器是沒有問題的,因為客戶端出於未知原因不想使用它,也無法更改現有表

誰能告訴我是否有其他方法可以實現這一目標。我只想在單獨的表中記錄事務的時間和插入或更新行的 ROWID。

背景資料

事務記錄在日誌/歸檔日誌文件中。

從那裡,您可以找到諸如

  • 更改了哪些值
  • **+/- 3 秒**內的變化時間
  • 誰在什麼情況下更改了它(中的值SYS_CONTEXT)(*)

時間

“交易時間”來自 SCN。因此,時間解析度為“ +/- 3 秒”。

如果您需要更高的解析度,則業務需要接受一些架構修改。

例子:

alter table T add (
   time_of_insert timestamp default systimestamp -- possibly INVISIBLE
);

查詢之間的版本

VERSIONS BETWEEN 查詢添加以下偽列

  • VERSIONS_STARTSCN
  • VERSIONS_STARTTIME
  • VERSIONS_ENDSCN
  • VERSIONS_ENDTIME
  • VERSIONS_XID
  • VERSIONS_OPERATION - (I)nsert, (U)pdate, (D)elete

“你能走多遠”取決於 UNDO 表空間。通常是 1 小時。YMMV。

要擴展範圍,請使用閃回數據存檔。

日誌礦工

在 11g 之前,訪問“事務發生時”的唯一方法是使用 LogMiner。

這可以通過DBMS_LOGMNR包來完成。

閃回數據存檔

11g 引入了一項稱為Flashback Data Archive的功能。

此功能

  • 擴展 AS OF 和 VERSIONS BETWEEN 查詢的範圍。

  • 在後台執行。

  • 讀取日誌/歸檔日誌文件(我相信它也使用 LogMiner)

  • 將值記錄在單獨的表中

  • “舊值”會自動刪除

    • “舊值”由您的閃回存檔目標確定。

從 11.2.0.4 開始的所有 Oracle 版本都包含此功能。在 11.2.0.4 之前,您必須有一個特定的 EE 附加組件(

$$ $$). (*) 對於 12c,Flashback Data Archive 還可以選擇性地記錄 SYS_CONTEXT 的值。

其他連結

以下是有關閃回數據存檔的一些附加 URL

Oracle 審計隨 Oracle Enterprise 安裝一起提供。此處此處描述了許多選項。對於您的問題:

AUDIT SELECT,UPDATE, INSERT, DELETE
    ON <SchemaName>.<TableName>
    BY ACCESS
    WHENEVER SUCCESSFUL;

在此之前必須設置一些初始化參數: 使用 sysdba 以使用者身份登錄並發出以下命令:

ALTER SYSTEM SET audit_trail=db SCOPE=SPFILE;

然後關閉並重新啟動系統。

已審核的操作位於 SYS.AUD$ 中,任何具有 SYSDBA 或 DBA 權限的使用者都可以查看這些操作。有許多 Oracle 提供的視圖提供了更多詳細資訊:

SELECT view_name
FROM   dba_views
WHERE  view_name LIKE 'DBA%AUDIT%'
ORDER BY view_name;

這裡

引用自:https://dba.stackexchange.com/questions/252757