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

时间:2015-01-06 06:56:21

标签: oracle

我有一个视图来从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)当我在视图中使用update语句手动将包状态更新为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.

任何人都可以建议我需要检查或更新代码。

注意:我想过使用After Update触发器,但它不允许我在视图上使用相同的内容。

1 个答案:

答案 0 :(得分:1)

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