2012-10-25 65 views
1
create or replace TRIGGER REFRESH_REST_VIEW 
AFTER 
    INSERT OR UPDATE 
ON tbl_contract 
BEGIN 
    execute DBMS_MVIEW.REFRESH('REST_VIEW'); 
END REFRESH_REST_VIEW; 
commit; 

這是我用來刷新物化視圖的sql觸發器。但它說..如何使用觸發器刷新物化視圖?

Warning: execution completed with warning 
TRIGGER REFRESH_REST_VIEW Compiled. 

P.S. :觸發​​器將在表格的數據(由Materialized View使用)執行任何DML操作時執行。

我已經使用了足夠多,許多職位說這是可能的,但我沒有得到如何做到這一點。我嘗試使用常規的觸發器語法,但它不起作用。

Updated:

我現在想用過程和觸發器一樣..

create or replace 
PROCEDURE Rfresh_mate_views AS 
    BEGIN 
    DBMS_MVIEW.REFRESH('REST_VIEW'); 
    END Rfresh_mate_views; 


create or replace trigger refresh_company_mview 
after insert or update ON BCD.BCD_COMPANY 
begin 
RFRESH_MATE_VIEWS(); 
end refresh_company_mview; 

所有編譯成功,但同時在表更新,它說:

ORA-04092: cannot COMMIT in a trigger 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2449 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2429 
ORA-06512: at "BCD.RFRESH_MATE_VIEWS", line 3 
ORA-06512: at "BCD.REFRESH_COMPANY_MVIEW", line 2 
ORA-04088: error during execution of trigger 'BCD.REFRESH_COMPANY_MVIEW' 
+1

爲什麼你會想這樣做的觸發?爲什麼不將聲明視圖聲明爲'REFRESH FAST ON COMMIT'並讓Oracle在事務提交時自動刷新物化視圖? –

+0

謝謝洞穴,我試過了,它說.. SQL錯誤:ORA-12054:無法設置物化視圖的ON COMMIT刷新屬性 12054. 00000 - 「無法爲物化視圖設置ON COMMIT刷新屬性」 *原因:物化視圖不符合提交時刷新的條件。 *操作:僅指定有效的選項。 – manurajhada

回答

7

一點也沒有在觸發器中刷新物化視圖是沒有意義的。

您可以通過刪除單詞EXECUTE

create or replace TRIGGER REFRESH_REST_VIEW 
AFTER 
    INSERT OR UPDATE 
ON tbl_contract 
BEGIN 
    DBMS_MVIEW.REFRESH('REST_VIEW'); 
END REFRESH_REST_VIEW; 

這將導致觸發編譯解決語法錯誤。但是,當您嘗試執行INSERTUPDATE針對tbl_contract時,您現在將得到一個運行時錯誤,您不允許在觸發器中提交,因爲刷新物化視圖時會執行隱式提交,並且您無法在內部進行提交一個觸發器。

SQL> create table foo(col1 number); 

Table created. 

SQL> create materialized view mv_foo 
    2 as 
    3 select * 
    4 from foo; 

Materialized view created. 

SQL> create trigger trg_foo 
    2 after insert or update on foo 
    3 begin 
    4 dbms_mview.refresh('MV_FOO'); 
    5 end; 
    6/

Trigger created. 

SQL> insert into foo values(1); 
insert into foo values(1) 
      * 
ERROR at line 1: 
ORA-04092: cannot COMMIT in a trigger 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2760 
ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2740 
ORA-06512: at "SCOTT.TRG_FOO", line 2 
ORA-04088: error during execution of trigger 'SCOTT.TRG_FOO' 

您可能試圖通過吹走您的事務完整性並在自治事務中執行刷新來解決此問題。這將消除ORA-04092錯誤,但是物化視圖不會有未插入或更新的未落實數據作爲事務的一部分,該事務首先觸發了觸發器,這違反了刷新物化視圖的整個目的。

正確的做法不是首先使用觸發器。正確的做法是定義物化視圖以在提交時自行刷新 - REFRESH FAST ON COMMIT。由於您遇到無法在實例化視圖上設置ON COMMIT屬性的錯誤,因此您需要查看「數據倉庫指南」中列出的restrictions on fast refresh,並確保您的物化視圖應該可快速刷新。然後,您可以使用dbms_mview.explain_mview procedure來告訴您爲什麼物化視圖無法在提交時遞增刷新。

+0

請參閱更新的問題。 – manurajhada

+0

@manurajhada - 什麼更新的問題?我沒有看到您提問的任何更新。 –

+0

@manurajhada - 好的,現在我正在看編輯。看起來,如果你糾正了語法錯誤,你會看到我所說的你會看到的。您不能在觸發器中提交併刷新物化視圖發出隱式提交。在我最初的回答中,我談了一些關於如何使用自治事務來解決該錯誤的問題,但是刷新將無法看到您的事務所做的更改,這些更改不太可能是您想要的。我原來的回答是,你真的想要在提交時刷新物化視圖。 –