2015-01-06 73 views
0

我有一個視圖,從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'); 

而我的要求是火的時候,我的任何包將失效時發送電子郵件通知,由於一些數據庫鏈接丟失或依賴對象丟失或部署邏輯錯誤的任何錯誤代碼的觸發器。 所以,以下是我所創建的觸發器:

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 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

視圖上的觸發器不會觸發,因爲視圖未更新。您的視圖不多也不少於存儲的select語句。如果你不需要「實時響應」,我建議只需更改爲查詢all_objects的過程併發送郵件並通過作業運行即可。

+0

感謝您的信息,但通過使用作業,它將取決於時間戳。由於任何原因,我想發送一封郵件,因爲該包會變得無效。另外請建議任何方式來過濾來自all_objects(我使用該視圖的bcz)的項目特定包。提前致謝 ! – user4422741

+0

您是否知道'all_objects'顯示的對象並非真的無效?即使沒有對象完全無效,如果更改依賴對象,對象也會自動失效。即如果使用的表格被更改,則爲包裝。當程序包執行時,它們會在後臺重新編譯,或者可以通過alter [OBJECT_NAME]重新編譯重新編譯;'。但直到它們在對象視圖中顯示爲無效。 – evilive

+0

是的。所以,無論何時該軟件包由於某些依賴項(如您提到的)或部分錯誤的代碼部署而導致無效,我需要發送一封電子郵件。那麼,如何觸發一個事件,如果有任何對象在all_objects中無效,我應該如何過濾我的項目特定對象(因爲我們無法在此處使用View)請建議 – user4422741