簡體   English   中英

Oracle - Audit Trail Generator?

[英]Oracle - Audit Trail Generator?

我正在尋找一個通用程序,它將為Oracle數據庫生成審計跟蹤。 我們目前在SQL Server上使用類似的過程,並想知道是否存在Oracle等效項。 我們希望審計表將是一個單獨的表而不是原始表,並包括用戶/日期時間信息。

以下是我們使用的SQL Server等效項: https//www.codeproject.com/Articles/21068/Audit-Trail-Generator-for-Microsoft-SQL

任何意見是極大的贊賞。

如果您不想使用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)來了解哪個模塊和操作是什么操作:我在TrackTableORITrackTable ;

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

  • 以下是如何創建觸發器TRCK_BNK來跟蹤表BANK變化; 它將分為3個動作: DELETEUPDATEINSERT (如果需要,你可以刪除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;
/

然后向框架添加函數,生成給定表的觸發器,檢索更改,將表還原到給定日期...

注意:如果表格發生很大變化,這種跟蹤表格上每個變化的方式都會損害表現。 但是對於幾乎沒有變化的參數表來說非常棒。

看看基於UNDO數據的Oracles 閃回數據存檔 它可以配置為跟蹤對數據的任何更改。 它自11g2(11.2.0.4)以來可用於任何版本的oracle。 Oracle文檔中,它表示最佳化是有限的,但任何版本都可以使用基本功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM