如何使用触发器刷新物化视图?

时间:2012-10-25 12:15:49

标签: sql oracle triggers oracle10g materialized-views

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;

这是我用来刷新Materialized View的sql触发器。但它说..

Warning: execution completed with warning
TRIGGER REFRESH_REST_VIEW Compiled.

P.S。 :当表的数据(由物化视图使用)进行任何DML操作时,将执行触发器。

我已经google了足够多,很多帖子说这是可能的,但我没有得到如何做到这一点。我尝试使用常规触发器语法,但它不起作用。

  

更新

现在我尝试使用过程和触发器进行相同的操作..

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'

2 个答案:

答案 0 :(得分: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;

这将导致触发器编译。但是,当您尝试对INSERT执行UPDATEtbl_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错误,但物化视图将不会有作为首先触发触发器的事务的一部分插入或更新的未提交数据,这会破坏物化视图的整个目的。< / p>

正确的方法是首先不要使用触发器。正确的方法是定义物化视图以在commit-- REFRESH FAST ON COMMIT上刷新自己。由于您收到的错误是您无法在实体化视图中设置ON COMMIT属性,因此您需要查看“数据仓库指南”中列出的restrictions on fast refresh,并确保您的实体化视图应该快速刷新。然后,您可以使用dbms_mview.explain_mview procedure告诉您为什么实体化视图不能在提交时以增量方式刷新。

答案 1 :(得分:0)