无法在预建表上重新创建物化视图

时间:2016-07-13 07:26:57

标签: sql oracle ddl materialized-views

我正在尝试执行的步骤:

CREATE TABLE sample.MV(application_mode varchar2(25));

CREATE MATERIALIZED VIEW sample.MV
ON PREBUILT TABLE
REFRESH FORCE ON DEMAND
AS
SELECT application_mode
  FROM  sample.tbl_name
  WHERE cnt > 0;

当任何其他用户试图放弃并重新创建MV时

DROP MATERIALIZED VIEW sample.MV;
CREATE MATERIALIZED VIEW sample.MV
ON PREBUILT TABLE
REFRESH FORCE ON DEMAND
AS
SELECT application_mode
  FROM  sample.tbl_name
  WHERE cnt > 0;

他在重新创作时遇到错误:

  

ORA-32334:无法在表格上创建预建的物化视图   由MV引用

为什么会这样?

用户可以解决相同的问题,即首先删除表格 然后重新创建表格,重新创建MV。

oracle的奇怪行为是该用户删除和重新创建MV的所有后续尝试都能正常运行而没有错误。

3 个答案:

答案 0 :(得分:0)

更新2:它确实与直接或间接使用/使用此的其他mview相关联。 (@Marmite Bomber的建议,但他的基于all_snapshots的查询无效

您可以使用user_dependencies(或者all_dependencies)使用以下查询之类的内容找到它。您可能必须在同义词,视图,函数等上遵循一些依赖关系图来查找连接。

(在我的情况下,我知道在使用preserve table删除matview之前存在依赖关系。所以这个表仍然是"某种程度上连接到某些依赖"更高&#34 ; matview因此似乎发出了错误。)

select * from user_dependencies 
where 1=1  -- for easier comment filter usage below 
  --and referenced_owner=user  -- if only current user relevant
  --and not type in ('TRIGGER')  -- e.g. to skip some auto-gen. triggers
  and referenced_name = '<my matview>'
order by name, referenced_name

所以一个工作解决方案也是放弃&#34;更高&#34; /取决于mview(s)(例如使用preserve table选项)并重新创建它们(例如prebuilt table选项,因此无需重建。

以前/过去的发现/解决方法:

我有同样的问题,我自动&#34;重命名&#34;一些具体化的观点,这在程序上是不可能的(11.2)。 所以我从旧的matviews创建了新的matviews

  1. 删除它们,但不删除表数据(preserve table)和
  2. 将现有表格与新表格重新关联(prebuilt table)。
  3. 一切都运行良好,但对于一个导致此ORA-32334的matview: - (

    使用以下SQL进行调试并未提供线索,为什么系统认为此表仍与某些matview相关联,因此我只能假设它是某种随机行为的错误:

    select * from user_mviews
    
    select * from user_objects
    where object_name like '%<some meaningful filter criteria>%'
    order by object_type, object_name
    

    我的解决方法:从头开始重新创建特定的mview。

答案 1 :(得分:-1)

这是11.2

上预期的行为
select * from v$version;

Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production

定义表MV并在其上构建物化视图。

create table mv as 
SELECT  application_mode
  FROM   tbl_name
  WHERE cnt > 0
;

CREATE MATERIALIZED VIEW  MV
ON PREBUILT TABLE
REFRESH FORCE ON DEMAND
AS
SELECT   application_mode
  FROM   tbl_name
  WHERE cnt > 0
;

现在检查两个对象是否存在

select  object_type, object_name from user_objects where object_name = 'MV';

OBJECT_TYPE         OBJECT_NAME
------------------- -----------
TABLE               MV          
MATERIALIZED VIEW   MV

现在删除物化视图并重新检查对象

DROP MATERIALIZED VIEW  MV;

select  object_type, object_name from user_objects where object_name = 'MV';

OBJECT_TYPE         OBJECT_NAME
------------------- -----------
TABLE               MV    

好的,物化视图消失了,但是桌子存在,为什么?

您可能需要查看文档here

  

如果删除在预构建表上创建的实体化视图,则数据库将删除实例化视图,预建表将恢复为其作为表的标识。

因此,该表存在,您可以再次在其上构建物化视图。

CREATE MATERIALIZED VIEW  MV
ON PREBUILT TABLE
REFRESH FORCE ON DEMAND
AS
SELECT   application_mode
  FROM   tbl_name
  WHERE cnt > 0
;


select  object_type, object_name from user_objects where object_name = 'MV';

OBJECT_TYPE         OBJECT_NAME
------------------- -----------
TABLE               MV          
MATERIALIZED VIEW   MV

请注意,在您的情况下,当物化视图基于预建表时,“PRESERVE TABLE”是DROP中的默认行为,因此您获得的效果相同

 DROP MATERIALIZED VIEW  MV PRESERVE TABLE;

select  object_type, object_name from user_objects where object_name = 'MV';

OBJECT_TYPE         OBJECT_NAME
------------------- -----------
TABLE               MV 

该表存在于DROP物化视图之后。

请检查这个简单的场景,看它是否有效。还要检查您的Oracle版本 - {10}中引入了PRESERVE TABLE

答案 2 :(得分:-1)

ORA-32334 的问题在于您拥有嵌套的物化视图。

可能的情况如下 - 其他物化视图MV

引用了物化视图MV2
create table mv as 
SELECT max(application_mode) application_mode
  FROM   tbl_name
  WHERE cnt > 0
  GROUP BY modes;


CREATE MATERIALIZED VIEW  MV
ON PREBUILT TABLE
REFRESH FORCE ON DEMAND
AS
SELECT   application_mode
  FROM   tbl_name
  WHERE cnt > 0
;

create MATERIALIZED VIEW  MV2
REFRESH FORCE ON DEMAND
AS
SELECT  *
  FROM   MV
;

MV的DROP不是问题......

 DROP MATERIALIZED VIEW  MV;

但重新创造会产生错误:

CREATE MATERIALIZED VIEW  MV
ON PREBUILT TABLE
REFRESH FORCE ON DEMAND
AS
SELECT   application_mode
  FROM   tbl_name
  WHERE cnt > 0
;

SQL-Fehler: ORA-32334: cannot create prebuilt materialized view on a table already referenced by a MV 

位于已被MV引用

因此,请找到导致问题的物化视图:

select  name, owner, master_owner, master 
from all_snapshots where 
master ='MV';

NAME                           OWNER                          MASTER_OWNER                   MASTER                       
------------------------------ ------------------------------ ------------------------------ ------------------------------
MV2                            SAMPLE                         SAMPLE                         MV 

必须首先删除MV2

DROP MATERIALIZED VIEW  MV2;

比物化视图MV可以重建。

CREATE MATERIALIZED VIEW  MV
ON PREBUILT TABLE
REFRESH FORCE ON DEMAND
AS
SELECT   application_mode
  FROM   tbl_name
  WHERE cnt > 0
;

之后必须再次构建MV2。