除非在视图上手动更新,否则不会自动触发视图上的更新触发器

Posted

技术标签:

【中文标题】除非在视图上手动更新,否则不会自动触发视图上的更新触发器【英文标题】:Instead of update trigger on view is not fired automatically unless manually updated on View 【发布时间】:2015-01-06 06:56:21 【问题描述】:

我有一个视图来从 Oracle DB 中的 all_objects 中获取我的项目特定包的列表,这将获取名称、状态、创建的和最后一个 DDL 的通配符运算符特定于我的项目要求的所有对象。

CREATE OR REPLACE FORCE VIEW ALL_XYZ_PACKAGES_VW
AS
   SELECT object_name,status, object_type,created,last_ddl_time
     FROM all_objects
    WHERE object_name LIKE 'XYZ_%'
     AND object_type IN ('PACKAGE', 'PACKAGE BODY');

我的要求是触发一个触发器,当我的任何包由于缺少某些 DB 链接或依赖对象或任何错误代码部署而出现逻辑错误而变得无效时,该触发器会发送电子邮件通知。 所以以下是我创建的触发器:

CREATE OR REPLACE TRIGGER notify_invalidobjects_trigger 
   INSTEAD OF UPDATE ON ALL_XYZ_PACKAGES_VW
FOR EACH ROW
BEGIN
  IF (:NEW.STATUS = 'INVALID') THEN
    DBMS_OUTPUT.PUT_LINE ('Following mentioned Package is in INVALID state: '|| :OLD.OBJECT_NAME); -- Email notification part will e written here
  ELSE
      DBMS_OUTPUT.PUT_LINE ('In Else Block');
  END IF;
END;
/

问题: 1) 当我在我的视图中使用更新语句手动将包状态更新为 INVALID 时,触发器被触发。

但是当包自动变得无效时,当我将一些依赖对象作为Invalid or by wrong code deployment 时,

TRIGGER IS NOT GETTING FIRED EVEN THE STATUS IS 
GETTING INAVLID AUTOMATICALLY IN MY VIEW AND ALL_OBJECTS.

谁能建议我在代码中需要检查或更新什么。

注意:我曾想过使用更新后触发器,但它不允许我在视图上使用相同的触发器。

【问题讨论】:

【参考方案1】:

视图上的触发器不会触发,因为视图没有更新。您的视图不多也不少于存储的 select 语句。如果您不需要“实时响应”,我建议您更改为查询 all_objects 的过程并发送邮件并通过作业运行它。

【讨论】:

感谢您提供信息,但通过使用该作业,它将取决于时间戳。由于任何原因导致包裹无效,我想发送一封邮件。还请建议任何方法从 all_objects 过滤我的项目特定包(我使用了视图)。提前致谢! 您是否知道all_objects 显示了并非真正无效的无效对象?如果您更改依赖对象,即使没有对象是真正无效的,对象也会自动失效。 IE。如果已使用的表被更改,则为包。它们在执行包时在后台重新编译,或者可以通过alter [OBJECT_NAME] recompile; 重新编译。但直到它们在对象视图中显示为无效。 是的,没错。因此,每当该包由于某些依赖项(如您所提到的)或某些错误的代码部署而无效时,我需要发送一封电子邮件。那么我应该如何触发一个事件,如果任何对象在 all_objects 中无效,我应该如何过滤我的项目特定对象(因为我们不能在这里使用查看)请建议 对不起,到目前为止,我能想到的唯一解决方案是“不可行”;)无论如何,我不明白引发这么多误报的用途。在我看来,如果不至少在查询之前重新编译,这个概念就没有意义。 Mayby 你应该仔细看看 DDL-Triggers:dba-oracle.com/t_ddl_triggers.htm 以找到另一个解决方案? @user4422741 - 不应该丢失依赖关系,并且不应该以你需要监控的方式发生“错误的代码部署” - 如果你认为你需要经常检查这个,那么这表明你'重新允许不受控制的更改,或者充其量是您的代码依赖于您无法控制的其他代码,并且可能会在您不知情的情况下进行更新。这似乎是一个部署/管理问题,您正试图对其进行粘贴,所以您是否需要重新考虑您的程序?

以上是关于除非在视图上手动更新,否则不会自动触发视图上的更新触发器的主要内容,如果未能解决你的问题,请参考以下文章

iOS 自动布局过程

除非主窗口未聚焦,否则不会更新 QLabel

除非主窗口未聚焦,否则不会更新 QLabel

QListView 更新 - 不触发更新

angular 数据绑定

React 路由器 4 不会更新链接上的视图,但会更新