【问题标题】:Need to insert machine name and DML command in table through trigger需要通过触发器在表中插入机器名和 DML 命令
【发布时间】:2020-11-14 04:48:28
【问题描述】:

我需要创建一个触发器,可以在审计表中插入 DML 命令 - insert update delete 已在基表上使用,并带有机器名称。

请指导我。

【问题讨论】:

标签: oracle database-trigger audit


【解决方案1】:

让我给你看一个例子:

1.我将在其中进行 dml 操作的表 my_test

2.记录操作的审计表

3.一个触发器来捕获感兴趣的值。

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

现在让我们对表格进行一些 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.

验证审计表

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,这在这种特定情况下要好得多。

【讨论】:

    猜你喜欢
    • 2013-04-03
    • 1970-01-01
    • 2020-08-29
    • 2023-03-28
    • 1970-01-01
    • 2014-05-30
    • 2010-09-29
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多