오라클 네이티브 메커니즘을 사용하고 싶지 않다면 자체 감사 테이블을 생성하고 읽는 고유 한 프레임 워크를 가질 수 있습니다.
:
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
(기본 키) 및 val
와 BANK
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 : 테이블의 모든 변경 사항을 추적하는이 방법은 테이블이 많이 변경되는 경우 성능을 저하시킵니다. 그러나 거의 변하지 않는 매개 변수 테이블에는 유용합니다.
오라클의 기본 감사를 사용해 보셨습니까? https://docs.oracle.com/database/121/DBSEG/auditing.htm –
안녕하세요 @MartinBerger, DBA는 성능/공간 문제에 대한 우려로 인해 Oracle 감사 기능을 켜고 싶지 않습니다. 이상적으로 우리는 행 수준 감사를 위해 DB 트리거를 사용합니다. 감사합니다. – AAA
집에서 작성한 감사가 내장 감사보다 적은 공간을 차지할 것입니다. –