除非在视图上手动更新,否则不会自动触发视图上的更新触发器
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 - 不应该丢失依赖关系,并且不应该以你需要监控的方式发生“错误的代码部署” - 如果你认为你需要经常检查这个,那么这表明你'重新允许不受控制的更改,或者充其量是您的代码依赖于您无法控制的其他代码,并且可能会在您不知情的情况下进行更新。这似乎是一个部署/管理问题,您正试图对其进行粘贴,所以您是否需要重新考虑您的程序?以上是关于除非在视图上手动更新,否则不会自动触发视图上的更新触发器的主要内容,如果未能解决你的问题,请参考以下文章