我正在尝试执行的步骤:
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的所有后续尝试都能正常运行而没有错误。
答案 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
preserve table
)和prebuilt table
)。一切都运行良好,但对于一个导致此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。