【问题标题】:"who_called_me" equivalent for HibernateHibernate 的“who_call_me”等价物
【发布时间】:2014-03-08 14:12:27
【问题描述】:

我们知道可以动态计算出当前正在执行的过程或包的名称,如herehere 所述。这通常适用于从数据库中的其他存储过程(已编译)执行的语句。

问题:

我们一直在尝试通过在表上放置触发器并从触发器中调用 who_called_me 来记录特定列(称为 STATE)上的所有 UPDATE 活动。这样做的目的显然是根据应用程序设计,列STATE 可以根据某些业务条件通过多段代码(驻留在数据库中)进行更新。除此之外,该列还可以由基于休眠的应用程序的应用程序更新,并且有时当通过休眠查询发生更新时,who_called_me 函数不返回任何内容。应用程序中有多个部分也可以根据某些条件UPDATESTATE

who_called_me 策略在存储过程(驻留在数据库中)发出UPDATE 语句并且who_called_me 成功捕获相应的所有者、名称、行号的情况下对我们很有效. 等的存储过程。但是如果UPDATE 发生在休眠状态,该函数不会捕获任何细节。

有没有办法通过触发器捕获该行的哪个休眠查询UPDATEd?或者有没有其他办法?

注意:触发代码与this问题上的答案类似。

【问题讨论】:

    标签: oracle hibernate stored-procedures triggers


    【解决方案1】:

    事实证明,who_called_me 方法更适用于存储过程调用,其中堆栈跟踪可以准确地指向调用 DML 的哪一行。在休眠的情况下,代码可能不会调用存储过程,但反过来可能具有根据特定条件调用的单独 DML。与@simon 给出的其他答案相反,ora_sql_txt 函数可能只在系统事件触发器中起作用,或者我可能错了,但无论哪种方式它都无法捕获 Hibernate 发出的 SQL 语句(测试它不起作用并返回一个NULL 值)。

    所以说到底,要找出 SQL Hibernate 正在使用什么,DB Trace 文件和 Hibernate 调试级别日志是目前唯一的方法。

    【讨论】:

      【解决方案2】:

      您可以使用 ora_sql_text 函数跟踪查询,例如这是我使用的函数:

      -- getting sql code, which is calling the current event, as clob
      function getEventSQLtext
        return clob
        is
          sqllob      clob;
          sql_text    ora_name_list_t;
          dummy       integer;
      begin
        dummy := ora_sql_txt(sql_text);
      
        dbms_lob.createtemporary(sqllob,false);
      
        for i in 1..sql_text.count loop
          dbms_lob.writeappend(sqllob,length(sql_text(i)),sql_text(i));
        end loop;
      
        return sqllob;
        if dummy is null then null; end if; -- removing warning of non-used variable :)
      end;
      

      这将是一个由 hibernate 生成的查询,这是您可以获得的唯一信息,因为这应该是 hibernate 可以对 DB 做的唯一事情。

      【讨论】:

      • 当我调用这个函数时,我得到这个错误06531. 00000 - "Reference to uninitialized collection"
      • 你应该在触发器中调用它,我认为你根本没有 SQL 可以返回 sql_text
      • 是的,我从触发器中调用了它,但它导致了一个静默错误,进而导致 DML 无法在桌面上工作。我很确定 SQL 操作是从 Hibernate 完成的。
      猜你喜欢
      • 2011-11-06
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 2019-08-23
      • 2020-10-03
      • 1970-01-01
      相关资源
      最近更新 更多