2017-10-09 17 views
7

Oracle 데이터베이스에 대한 감사 추적을 생성하는 일반 프로 시저를 찾고 있습니다. 우리는 현재 SQL Server에서 이와 유사한 절차를 사용하고 있으며 Oracle과 동일한 기능이 있는지 궁금해합니다. 감사 테이블이 원본 테이블과 별도의 테이블이되고 사용자/날짜 시간 정보가 포함되기를 기대합니다. 어떤 조언을 크게 감사 https://www.codeproject.com/Articles/21068/Audit-Trail-Generator-for-Microsoft-SQL오라클 - 감사 추적 생성기?

: 여기

우리가 사용하는 SQL 서버와 동일합니다.

+2

오라클의 기본 감사를 사용해 보셨습니까? https://docs.oracle.com/database/121/DBSEG/auditing.htm –

+0

안녕하세요 @MartinBerger, DBA는 성능/공간 문제에 대한 우려로 인해 Oracle 감사 기능을 켜고 싶지 않습니다. 이상적으로 우리는 행 수준 감사를 위해 DB 트리거를 사용합니다. 감사합니다. – AAA

+3

집에서 작성한 감사가 내장 감사보다 적은 공간을 차지할 것입니다. –

답변

3

오라클 네이티브 메커니즘을 사용하고 싶지 않다면 자체 감사 테이블을 생성하고 읽는 고유 한 프레임 워크를 가질 수 있습니다.

  • a_sqnc 당신이 열 NO_ORD (또한 수정 시간과 D_UPD 열이 있더라도) 조치의 순서를 추적 할 TrackTable에 사용하는 순서입니다 : 여기

    의 주요 구성 요소 .
    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); 
  • 는 간단한 테이블이 말은 두 개의 열 PK_val (기본 키) 및 valBANK
    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)을 사용하면 어떤 모듈과 어떤 동작이 작동하는지 알 수 있습니다. 두 열을 모두 TrackTable에 연결합니다.

    • user Oracle 세션 변수를 통해 c_user 열의 변경을 추적 할 수 있습니다.

    • TRCK_BNK 트리거를 작성하여 테이블 BANK의 변경 사항을 추적하는 방법은 다음과 같습니다. 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; 
      /
      

    그런 다음, 트리거가 테이블을 부여 생성 변경을 검색, 지정된 날짜에 테이블을 되돌아 귀하의 프레임 워크에 기능을 추가 ...

    NB : 테이블의 모든 변경 사항을 추적하는이 방법은 테이블이 많이 변경되는 경우 성능을 저하시킵니다. 그러나 거의 변하지 않는 매개 변수 테이블에는 유용합니다.

2

UNDO 데이터를 기반으로 한 Oracles Flashback Data Archive을 살펴보십시오. 데이터 변경을 추적하도록 구성 할 수 있습니다. 11g2 (11.2.0.4) 이후 Oracle의 모든 에디션에서 사용할 수 있습니다. Oracle documentation에는 최적화가 제한되어 있지만 기본 기능은 모든 버전에서 사용할 수 있다고 나와 있습니다.