Oracle是否有视图/表(sys或不是),存储在指定表上执行DML的存储过程/函数的名称?例如,我有3个程序使用同一个表。应用程序根据内部逻辑调用每个过程。我想知道为了执行DML而调用了哪些过程。 显然,应用程序可能已经记录了这一点,但就我而言,它还没有。
答案 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”,其中包含要修改的行的新旧值。您也可以记录它们,或者只有在执行了某些特定更改时才可以测试它们的值以写入日志