gpt4 book ai didi

sql - 如何使用触发器刷新物化 View ?

转载 作者:行者123 更新时间:2023-12-03 22:58:28 25 4
gpt4 key购买 nike

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;

这是我用来刷新物化 View 的 sql 触发器。但它说..
Warning: execution completed with warning
TRIGGER REFRESH_REST_VIEW Compiled.

附言:当表(物化 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'

最佳答案

在触发器中刷新物化 View 没有意义。

您可以通过删除单词 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 时或 UPDATE反对 tbl_contract ,您现在将收到一个运行时错误,您不允许在触发器中提交,因为刷新物化 View 会执行隐式提交,并且您无法在触发器内提交。
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 错误,但随后物化 View 不会将未提交的数据作为事务的一部分插入或更新,这些数据首先触发触发器,这违背了刷新物化 View 的整个目的。

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

关于sql - 如何使用触发器刷新物化 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13068366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com