我正在寻找一个通用程序,它将为Oracle数据库生成审计跟踪.我们目前在sql Server上使用类似的过程,并想知道是否存在Oracle等效项.我们希望审计表将是一个单独的表而不是原始表,并包括用户/日期时间信息.
这是我们使用的sql Server等效项:https://www.codeproject.com/Articles/21068/Audit-Trail-Generator-for-Microsoft-SQL
任何意见是极大的赞赏.
如果您不想使用Oracle本机机制,您可以拥有自己的框架来生成和读取您自己的审计表(我知道您可以,我曾经有过类似的工作).
原文链接:https://www.f2er.com/oracle/205022.html以下是主要组件:
> 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_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);
>假设您有一个简单的表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)来了解哪个模块和操作是什么操作:我在TrackTable的列ORI中连接;
>用户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,'NEW',:NEW.pk_val,:NEW.val,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,-1,'ERR','Grrr: '||W_CODE,W_ERRM,sysdate From Dual; End; End; /
然后向框架添加函数,生成给定表的触发器,检索更改,将表还原到给定日期……
注意:如果表格变化很大,这种跟踪表格上的每个变化的方式都会损害表现.但它很适合几乎没有变化的参数表.