需要通过触发器在table中插入机器名和DML命令
Need to insert machine name and DML command in table through trigger
我需要创建一个可以在审计中插入的触发器 table 已在基础 table 加上机器名称上使用了 DML 命令-插入更新删除。
请指导我。
举个例子:
1.A table my_test 我将在其中进行 dml 操作
2.An审计table记录操作
3.A 触发器捕获感兴趣的值。
SQL> create table my_test ( c1 number, c2 number );
Table created.
SQL> create table audit_my_test ( id_timestamp timestamp,
session_id number,
username varchar2(30),
machine varchar2(50),
sql_text varchar2(400),
operation_type varchar2(20)
);
Table created.
SQL> create or replace trigger my_trg_my_test after insert or delete or update on my_test
referencing new as new old as old
for each row
declare
v_sql varchar2(400);
v_usr varchar2(40);
v_ope varchar2(20);
v_ter varchar2(50);
v_sid number;
begin
select sys_context('USERENV','SESSION_USER'),
sys_context('USERENV','CURRENT_SQL'),
sys_context('USERENV','SID'),
sys_context('USERENV','HOST')
into
v_usr,
v_sql,
v_sid,
v_ter
from dual;
IF INSERTING THEN
v_ope := 'Insert';
ELSIF UPDATING THEN
v_ope := 'Update';
ELSIF DELETING THEN
v_ope := 'Delete';
END IF;
insert into audit_my_test values ( systimestamp , v_sid, v_usr, v_ter, v_sql, v_ope );
end;
/
Trigger created.
SQL> show err
No errors
现在让我们对 table
进行一些 DML 操作
SQL> insert into my_test values ( 1 , 1) ;
1 row created.
SQL> insert into my_test values ( 2 , 2) ;
1 row created.
SQL> commit;
Commit complete.
验证审核table
ID_TIMESTAMP SESSION_ID USERNAME MACHINE
--------------------------------------------------------------------------- ---------- ------------------------------ ------------------------------
SQL_TEXT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OPERATION_
----------
24-JUL-20 01.01.25.567641 PM 328 SYS scglvdoracd0006.scger.dev.corp
Insert
24-JUL-20 01.01.45.514662 PM 328 SYS scglvdoracd0006.scger.dev.corp
Insert
ID_TIMESTAMP SESSION_ID USERNAME MACHINE
--------------------------------------------------------------------------- ---------- ------------------------------ ------------------------------
SQL_TEXT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OPERATION_
----------
您可以在此处阅读 sys_context 的所有属性:
https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions165.htm
这个解决方案的问题:你永远不会得到SQL负责操作。 SYS_CONTEXT 中的 CURRENT_SQL 仅在过程内部工作,并且当它作为处理程序在细粒度访问 (FGA) 策略中被调用时。
如果您需要 SQL 负责操作,您要么构造一个 FGA 策略和一个处理程序,要么使用 AUDIT,这在这种特定情况下要好得多。
我需要创建一个可以在审计中插入的触发器 table 已在基础 table 加上机器名称上使用了 DML 命令-插入更新删除。
请指导我。
举个例子:
1.A table my_test 我将在其中进行 dml 操作
2.An审计table记录操作
3.A 触发器捕获感兴趣的值。
SQL> create table my_test ( c1 number, c2 number );
Table created.
SQL> create table audit_my_test ( id_timestamp timestamp,
session_id number,
username varchar2(30),
machine varchar2(50),
sql_text varchar2(400),
operation_type varchar2(20)
);
Table created.
SQL> create or replace trigger my_trg_my_test after insert or delete or update on my_test
referencing new as new old as old
for each row
declare
v_sql varchar2(400);
v_usr varchar2(40);
v_ope varchar2(20);
v_ter varchar2(50);
v_sid number;
begin
select sys_context('USERENV','SESSION_USER'),
sys_context('USERENV','CURRENT_SQL'),
sys_context('USERENV','SID'),
sys_context('USERENV','HOST')
into
v_usr,
v_sql,
v_sid,
v_ter
from dual;
IF INSERTING THEN
v_ope := 'Insert';
ELSIF UPDATING THEN
v_ope := 'Update';
ELSIF DELETING THEN
v_ope := 'Delete';
END IF;
insert into audit_my_test values ( systimestamp , v_sid, v_usr, v_ter, v_sql, v_ope );
end;
/
Trigger created.
SQL> show err
No errors
现在让我们对 table
进行一些 DML 操作SQL> insert into my_test values ( 1 , 1) ;
1 row created.
SQL> insert into my_test values ( 2 , 2) ;
1 row created.
SQL> commit;
Commit complete.
验证审核table
ID_TIMESTAMP SESSION_ID USERNAME MACHINE
--------------------------------------------------------------------------- ---------- ------------------------------ ------------------------------
SQL_TEXT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OPERATION_
----------
24-JUL-20 01.01.25.567641 PM 328 SYS scglvdoracd0006.scger.dev.corp
Insert
24-JUL-20 01.01.45.514662 PM 328 SYS scglvdoracd0006.scger.dev.corp
Insert
ID_TIMESTAMP SESSION_ID USERNAME MACHINE
--------------------------------------------------------------------------- ---------- ------------------------------ ------------------------------
SQL_TEXT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OPERATION_
----------
您可以在此处阅读 sys_context 的所有属性:
https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions165.htm
这个解决方案的问题:你永远不会得到SQL负责操作。 SYS_CONTEXT 中的 CURRENT_SQL 仅在过程内部工作,并且当它作为处理程序在细粒度访问 (FGA) 策略中被调用时。
如果您需要 SQL 负责操作,您要么构造一个 FGA 策略和一个处理程序,要么使用 AUDIT,这在这种特定情况下要好得多。