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_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;
/

然后向框架添加函数,生成给定表的触发器,检索更改,将表还原到给定日期……

注意:如果表格变化很大,这种跟踪表格上的每个变化的方式都会损害表现.但它很适合几乎没有变化的参数表.

原文链接:https://www.f2er.com/oracle/205022.html

猜你在找的Oracle相关文章