2017-10-09 106 views
7

我正在尋找將爲Oracle數據庫生成審計跟蹤的通用過程。我們目前正在SQL Server上使用類似的過程,並想知道是否存在Oracle等價物。我們希望審計表將與原始表格分開,幷包含用戶/日期時間信息。Oracle - 審計跟蹤生成器?

這是我們使用SQL Server相當於:https://www.codeproject.com/Articles/21068/Audit-Trail-Generator-for-Microsoft-SQL

任何意見是極大的讚賞。

+2

您是否嘗試過Oracle的本機審計? https://docs.oracle.com/database/121/DBSEG/auditing.htm –

+0

Hi @MartinBerger,由於擔心性能/空間問題,DBA不想打開Oracle審覈。理想情況下,我們會使用數據庫觸發器進行行級審計。謝謝 – AAA

+3

我非常懷疑,任何本土審計將使用較少的空間,然後內置審計。 –

回答

3

如果你不想使用Oracle本地機制,你可以有你自己的框架來生成和讀取你自己的審計表(我知道你可以,我們曾經有過類似的工作)。

以下是主要成分:

  • a_sqnc是你將在TrackTable使用跟蹤行動的順序列NO_ORD(即使有也是D_UPD柱與修改時間)的序列。

create sequence a_sqnc 
minvalue 1 
maxvalue 99999999 
start with 1 
increment by 1 
nocache; 
  • TrackTable將以便跟蹤來自不同表的變化具有TABLE_NAME柱。它還有一個PK_VALUEROW_VALUE,我們在那裏存儲更改的數據。下面是表創建有用的索引:

create table TrackTable (
    table_name VARCHAR2(50) not null, 
    action  VARCHAR2(240) not null, 
    no_ord  NUMBER(12) not null, 
    nature  VARCHAR2(3) not null, 
    pk_value VARCHAR2(4000), 
    row_value VARCHAR2(4000), 
    ori  VARCHAR2(250), 
    c_user  VARCHAR2(20), 
    d_upd  DATE 
); 

create index AP_D_UPD on TrackTable (D_UPD); 
create index AP_NO_ORD on TrackTable (NO_ORD); 
create index AP_TABLE_NAME on TrackTable (TABLE_NAME); 
  • 假設你有一個簡單的表BANK兩列PK_val(主鍵)和val

create table BANK (
    pk_val VARCHAR2(50) not null, 
    val VARCHAR2(240) not null 
); 

alter table BANK 
    add constraint BK_PK primary key (pk_val) 
    using index ; 
  • 使用DBMS_APPLICATION_INFO.READ_MODULE(w_sess_mod, w_sess_act)知道哪些模塊和動作的作用:我將ORI列中的TrackTable連接在一起;

  • user Oracle會話變量將允許您跟蹤誰在列c_user列做了更改;

  • 以下是如何創建觸發器TRCK_BNK以跟蹤表BANK中的更改;它將分爲3個動作:DELETE,UPDATE, INSERT(如果需要,您可以刪除INSERT的情況)。


CREATE OR REPLACE TRIGGER "TRCK_BNK" 
AFTER DELETE OR INSERT OR UPDATE 
    ON BANK 
REFERENCING NEW AS NEW OLD AS OLD 
FOR EACH ROW 

DECLARE 
    w_a  VARCHAR2(10); 
    W_ERRM  VARCHAR2(1000); 
    W_CODE  VARCHAR2(1000); 
    w_n  VARCHAR2(200) := 'BANK'; 
    w_id  NUMBER := a_sqnc.nextval; 
    w_act  v$session.action%type; 
    w_mod  v$session.module%type; 
    w_ori  TrackTable.ORI%TYPE;  
BEGIN 
    DBMS_APPLICATION_INFO.READ_MODULE(w_mod, w_act); 
    w_ori := 'Module : '||w_mod ||' ; Action : '||w_act; 
    ---------------------------------- 
    -- test which action is for change 
    ---------------------------------- 
    IF UPDATING 
    THEN 
    w_a := 'UPDATE'; 
    ELSIF DELETING 
    THEN 
    w_a := 'DELETE'; 
    ELSIF INSERTING 
    THEN 
    w_a := 'INSERT'; 
    END IF; 
    ---------------------------------- 
    -- Insert into TrackTable 
    ---------------------------------- 
If w_a in ('UPDATE', 'DELETE') then 
    Insert into TrackTable 
     Select w_n, w_a, w_id, 'OLD', :OLD.pk_val, :OLD.val 
      , w_ori, user, sysdate 
     From Dual; 
End if; 

-- if you update, there is a new value and an old value 
If w_a in ('UPDATE', 'INSERT') then 
    Insert into TrackTable 
     Select w_n, w_a, w_id, 'NEW', :NEW.pk_val, :NEW.val 
      , w_ori, user, sysdate 
     From Dual; 
End if; 

Exception 
When others then 
    Begin 
    W_ERRM := SQLERRM; 
    W_CODE := SQLCODE; 
    -- try inserting in case of error anyway 
    Insert into TrackTable 
     Select w_n, w_a, -1, 'ERR', 'Grrr: '||W_CODE, W_ERRM 
       , w_ori, user, sysdate 
    From Dual; 
    End; 
End; 
/

然後添加功能,您的框架,產生觸發器給定一個表,檢索的變化,恢復表給定日期...

注意: 如果表格變化很大,這種跟蹤表格中每個變化的方法都會影響性能。但對於幾乎不會改變的參數表而言,這非常棒。

2

看看基於UNDO數據的Oracles Flashback Data Archive。它可以配置爲跟蹤對數據的任何更改。從11g2(11.2.0.4)開始,它可以在任何版本的Oracle中使用。 在Oracle documentation它說優化是有限的,但基本功能是可用的任何版本。