觸發器的替代方案
我正在開發一個 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;
從這裡