Oracle是否有关于哪个过程在指定表上执行DML的记录?

时间:2018-02-12 12:15:58

标签: oracle plsql

Oracle是否有视图/表(sys或不是),存储在指定表上执行DML的存储过程/函数的名称?例如,我有3个程序使用同一个表。应用程序根据内部逻辑调用每个过程。我想知道为了执行DML而调用了哪些过程。 显然,应用程序可能已经记录了这一点,但就我而言,它还没有。

1 个答案:

答案 0 :(得分:1)

在DBMS_UTILITY中有FORMAT_CALL_STACK函数,当在任何pl / sql过程或触发器中调用时,它返回已调用的所有过程的堆栈以到达您的代码(它列出调用者,调用者的调用者,等等。)

你可以像这样写一个触发器:

    create or replace trigger TRG_LOG_MYTABLE_EDITS
      after insert or delete or update
      on MYTABLE 
      for each row -- see following note about this option
    declare 
      op varchar2(1);
    begin
      if INSERTING then op := 'I';
      elsif DELETING then op := 'D';
      else op := 'U';
      end if;

      insert into mylog(DATETIME, OPERATION, CALL_STACK) 
      values ( sysdate, op, DBMS_UTILITY.format_call_stack);

    end TRG_LOG_MYTABLE_EDITS;

每次插入/删除或更新记录时,此触发器都会向表MYLOG添加一个条目...在此表中,您将找到对修改表的过程的引用。

注意:上面的触发器将在FOR EACH ROW中执行..因此,如果您发出修改1000行的单个更新命令,您将获得相同的命令记录1000次。如果您只想记录某人发出“删除”命令的事实(不关心已删除的行数),您可以省略触发器声明中的“for each row”行。

离开“for each row”选项可以访问:OLD和:NEW“pseudorecords”,其中包含要修改的行的新旧值。您也可以记录它们,或者只有在执行了某些特定更改时才可以测试它们的值以写入日志