【问题标题】:Capturing Package/Procedure/Function name from a trigger从触发器中捕获包/过程/函数名称
【发布时间】: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


    【解决方案1】:

    $$PLSQL_UNIT 只会提供包名称,而不是包中的过程名称。 who_called_me也是如此。

    owa_util.who_called_me 是基于不可估量的 Kyte 先生编写的一个小实用程序。如果您看一下his source code here,您会看到该例程从调用堆栈中获取其信息。因此它提供的信息是:

    • 程序所有者
    • 程序名称(包或独立程序)
    • 节目类型
    • 行号

    这些公认的令人沮丧的限制归结为重载:我们可以创建具有相同名称但不同签名的打包过程。因此,当涉及到识别哪段代码正在运行时,“过程名称”对系统来说并不是特别有用。

    无论如何,如果你想和who_called_me一起玩,它需要四个这样的输出参数:

    create or replace trigger my_trg 
    before insert or update on my_tab
    for each row
    declare
      l_owner varchar2(30);
      l_name varchar2(30);
      l_line pls_integer;
      l_type varchar2(30);
    begin
      owa_util.who_called_me(l_owner,l_name,l_line,l_type);
      IF INSERTING THEN
         insert into my_tab_log values('INSERTED A ROW'
                                       sysdate,
                                       l_owner||'.'||l_name); 
      END IF;
    end;
    /
    

    【讨论】:

    • 谢谢,我试试看。
    猜你喜欢
    • 1970-01-01
    • 2018-07-05
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    相关资源
    最近更新 更多