甲骨文 - 审计跟踪生成器?
Oracle - Audit Trail Generator?
我正在寻找可以为 Oracle 数据库生成审计跟踪的通用过程。我们目前正在 SQL 服务器上使用类似的程序,想知道是否存在 Oracle 等效程序。我们希望审计 table 与原来的 table 不同 table,并包括 user/date 时间信息。
这是我们正在使用的 SQL 服务器等效项:https://www.codeproject.com/Articles/21068/Audit-Trail-Generator-for-Microsoft-SQL
非常感谢任何建议。
如果你不想使用 Oracle 本机机制,你可以拥有自己的框架来生成和读取你自己的审计 table(我知道你可以,我曾经工作过的地方有类似的东西).
以下是主要组成部分:
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
列,以便跟踪来自不同 table 的更改。它还有一个 PK_VALUE
和 ROW_VALUE
用于存储更改的数据。这是带有有用索引的 table 创建:
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);
- 假设您有一个简单的 table
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
列中连接了两者;
user
Oracle 会话变量将允许您跟踪谁在列 c_user
;
中进行了更改
下面是如何创建触发器 TRCK_BNK
来跟踪 table 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;
/
然后向您的框架添加函数,在给定 table 的情况下生成触发器,检索更改,将 table 恢复到给定日期...
注意:
如果 table 变化很大,这种跟踪 table 上每个变化的方式会影响性能。但这对于参数 table 几乎没有变化的参数非常有用。
查看基于 UNDO 数据的 Oracles Flashback Data Archive。它可以配置为跟踪对数据的任何更改。它在 11g2 (11.2.0.4) 之后的任何版本的 oracle 中都可用。
在 Oracle documentation 它说优化是有限的,但基本功能在任何版本中都可用。
我正在寻找可以为 Oracle 数据库生成审计跟踪的通用过程。我们目前正在 SQL 服务器上使用类似的程序,想知道是否存在 Oracle 等效程序。我们希望审计 table 与原来的 table 不同 table,并包括 user/date 时间信息。
这是我们正在使用的 SQL 服务器等效项:https://www.codeproject.com/Articles/21068/Audit-Trail-Generator-for-Microsoft-SQL
非常感谢任何建议。
如果你不想使用 Oracle 本机机制,你可以拥有自己的框架来生成和读取你自己的审计 table(我知道你可以,我曾经工作过的地方有类似的东西).
以下是主要组成部分:
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
列,以便跟踪来自不同 table 的更改。它还有一个PK_VALUE
和ROW_VALUE
用于存储更改的数据。这是带有有用索引的 table 创建:
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);
- 假设您有一个简单的 table
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
列中连接了两者;user
Oracle 会话变量将允许您跟踪谁在列c_user
; 中进行了更改
下面是如何创建触发器
TRCK_BNK
来跟踪 tableBANK
中的变化;它将分为 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;
/
然后向您的框架添加函数,在给定 table 的情况下生成触发器,检索更改,将 table 恢复到给定日期...
注意: 如果 table 变化很大,这种跟踪 table 上每个变化的方式会影响性能。但这对于参数 table 几乎没有变化的参数非常有用。
查看基于 UNDO 数据的 Oracles Flashback Data Archive。它可以配置为跟踪对数据的任何更改。它在 11g2 (11.2.0.4) 之后的任何版本的 oracle 中都可用。 在 Oracle documentation 它说优化是有限的,但基本功能在任何版本中都可用。