【问题标题】:Oracle: find place in code where update was calledOracle:在代码中找到调用更新的位置
【发布时间】:2017-08-07 12:19:48
【问题描述】:

问题是:我的程序更新了特定列中的值,几毫秒后该值为空。我尝试找到将特定列中的值更改为 null 的位置。

是否可以检查 Oracle DB 中列上的哪些过程/触发器调用更新?

【问题讨论】:

  • column in my table is cleaned 这是什么意思?你想达到什么目的
  • @xing 我没有说清楚。这只是意味着此列中的值正在更改为 null。
  • 您可以查看 all_dependencies 以查看依赖于该表的所有包/过程/触发器;然后人工审核。您可以查询所有包含相关表的代码的 ALL_SOURCE 或类似 'fieldname = NULL' 但是这些方法假设有问题的代码在数据库中。 (这两个都假设您拥有查看所有对象详细信息所需的权限。
  • 如果我理解正确,您需要检查该列是否已更新。您可以为此使用triiger,如下所示。我不是假设它会是NULL。您可以在触发器中设置该条件。
  • 您有可以从 IDE(SQL Developer、PL/SQL Developer 等)运行的测试用例吗?如果是这样,我会在调试器中单步执行。

标签: sql database oracle plsql


【解决方案1】:

试试这个:

dbms_output.put_line(dbms_utility.format_call_stack);

您可以将此代码放入您认为您的字段正在更改值的触发器或过程/功能代码中。

【讨论】:

  • 太好了,这就是我要找的。​​span>
【解决方案2】:

如果我理解正确,您可以创建如下触发器。在这里,我正在检查表列的新值是否与旧值不同,然后显示 Updat occured on Column 的消息。您可以在下面显示的触发器的when 子句中扩展表的所有列的检查条件。

CREATE OR REPLACE TRIGGER chk
 BEFORE INSERT ON Your_Table
 FOR EACH ROW
WHEN (
new.col1 <> old.col1
OR new.col1 is NULL
      )
 begin      
   dbms_output.put_line('Updat occured on Column');
  end;
/

【讨论】:

  • 当我想看到更新的时刻时,这个解决方案很好。但我想另外打印一个触发更新的过程/触发器的名称。我的问题:我的程序更新了特定列中的值,几毫秒后这个值为空。
  • 您可以检查 DBA_DEPENDENCIES 以了解哪些所有 pkg​​ 和过程都在使用该表,但在您收到 AWR 报告之前,很难判断哪个在特定时间实际调用了该更新和你一起。
  • 感谢您最后的评论,它可能会有所帮助。
  • 您可以使WHEN 子句更加具体,以减少触发器的不当触发。例如,如果COL1 为空,则在更新数据库中的任何其他列时将触发此触发器。另外,请参阅 Andrey Khmelev 的答案,以获得比您目前所获得的更有用的DBMS_OUTPUT
猜你喜欢
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多