我正在寻找一个通用程序,它将为Oracle数据库生成审计跟踪.我们目前在SQL Server上使用类似的过程,并想知道是否存在Oracle等效项.我们希望审计表将是一个单独的表而不是原始表,并包括用户/日期时间信息.
以下是我们使用的SQL Server等效项:https://www.codeproject.com/Articles/21068/Audit-Trail-Generator-for-Microsoft-SQL
任何意见是极大的赞赏.
如果您不想使用 Oracle 本机机制,您可以拥有自己的框架来生成和读取自己的审计表(我知道您可以,我们曾经工作过类似的事情)。
以下是主要组件:
a_sqncTrackTable是您将用于跟踪列中操作顺序的序列NO_ORD(即使还有一个D_UPD包含修改时间的列)。create sequence a_sqnc
minvalue 1
maxvalue 99999999
start with 1
increment by 1
nocache;
Run Code Online (Sandbox Code Playgroud)
TrackTable将有一TABLE_NAME列来跟踪不同表的更改。它还有一个PK_VALUE和ROW_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);
Run Code Online (Sandbox Code Playgroud)
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 ;
Run Code Online (Sandbox Code Playgroud)
用于DBMS_APPLICATION_INFO.READ_MODULE(w_sess_mod, w_sess_act)了解哪些模块和哪些操作在操作:我将两者连接在ORI;TrackTable的列中
userOracle 会话变量将允许您跟踪谁对列进行了更改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;
/
Run Code Online (Sandbox Code Playgroud)
然后将函数添加到您的框架中,生成给定表的触发器、检索更改、将表恢复到给定日期...
注意: 如果表变化很大,这种跟踪表上每个变化的方式会影响性能。但这对于几乎不改变的参数表来说非常有用。
| 归档时间: |
|
| 查看次数: |
330 次 |
| 最近记录: |