【发布时间】:2013-01-11 08:52:32
【问题描述】:
我有一个表(Oracle 11g),多个包/存储过程在该表上运行 DML 语句。我想捕获使用触发器在表上发布 DML 的包/过程名称并将其记录到日志记录表中。
例如:
包MY_PACK.MY_PROC() 为表mytab 发出insert into...。我会在mytab 上设计一个触发器,它应该能够捕获发出insert into.. 的包/过程名称并将此信息存储在另一个表my_tab_log 中。
我做了一些搜索,发现 $$PLSQL_UNIT 和 $$PLSQL_LINE 可以指出过程名称,但是如果在触发器中使用这些变量,则会捕获触发器名称而不是包/过程名称发布了 DML 声明。
喜欢-
CREATE OR REPLACE TRIGGER my_trg
AFTER INSERT OR UPDATE OR DELETE
ON MY_TAB
FOR EACH ROW
BEGIN
IF INSERTING THEN
insert into my_tab_log values('INSERTED A ROW'
sysdate,
$$PLSQL_UNIT);
END IF;
-- This would capture Trigger name but I would like to capture `MY_PACK.MY_PROC()`
-- which issued the insert statement
...
END;
现在因为 $$PLSQL_UNIT 是一个条件编译指令。当您编译/重新编译 PL/SQL 代码时,它会得到解决。所以不幸的是,触发器中的 $$PLSQL_UNIT 只不过是触发器名称,并在触发器编译时解析。
我还找到了程序owa_util.who_called_me,但无法弄清楚如何使用它来满足我的需求。甚至可以在不更改发出 DML 语句的实际包/存储过程的情况下实现我想要的吗?我不能修改这些程序,这是对它的严格限制,所以这不是一个选项。
【问题讨论】:
标签: oracle stored-procedures plsql triggers