Oracle

Oracle 12c - 在 ORA-00942 中創建物化視圖結果

  • October 28, 2016

我有一個觀點,我可以通過這樣的數據庫連結訪問:

SQL> select count(*) from REMOTE_SCHEMA.REMOTE_VIEW@REMOTE_DB;

COUNT(*)
--------
110

我可以通過同義詞創建並成功查詢遠端視圖:

SQL> create synonym REMOTE_VIEW for REMOTE_SCHEMA.REMOTE_VIEW@REMOTE_DB;

Synonym created

SQL> select count(*) from REMOTE_VIEW;

COUNT(*)
--------
110

但是,如果我嘗試使用同義詞創建物化視圖,則會失敗:

SQL> create materialized view REMOTE_MV
build immediate
refresh complete
next sysdate+1
with ROWID
as
select * from REMOTE_VIEW;

ORA-00942: table or view does not exist

創建沒有同義詞的物化視圖成功:

SQL> create materialized view REMOTE_MV
build immediate
refresh complete
next sysdate+1
with ROWID
as
select * from REMOTE_SCHEMA.REMOTE_VIEW@REMOTE_DB;

Materialized view created

任何想法為什麼使用同義詞失敗?理想情況下,我想使用同義詞將物化視圖與數據庫連結隔離開來。數據庫連結可能因環境而異,我想確保物化視圖查詢保持不變。

設法弄清楚了!您可以在同義詞上創建物化視圖,但是導致問題的原因是我對基於版本的重新定義 (EBR) 缺乏理解。

預設情況下,私有同義詞是 EDITIONABLE:

創建同義詞

$$ EDITIONABLE | NONEDITIONABLE $$ 如果為 schema 中的模式對像類型 SYNONYM 啟用了版本,則使用這些子句指定同義詞是版本對像還是非版本對象。對於私有同義詞,預設值為 EDITIONABLE。對於公共同義詞,預設值為 NONEDITIONABLE。

然而,物化視圖是非編輯對象:

使用基於版本的重新定義

24.1.1.2.1 物化視圖

物化視圖是可以指定評估版本的非版本對象,從而使其能夠依賴於版本對象。

> > 創建物化視圖 > > $$ schema. $$materialized_view other_clauses > $$ evaluation_edition_clause $$ $$ query_rewrite_clause $$AS 子查詢 > 其中evaluation_edition_clause 是: > > > 使用 { 目前版本 | 評估 EDITION 版 | 空版 } > > >

CURRENT EDITION 是執行 DDL 語句的版本。指定 NULL EDITION 相當於省略包含它的子句。如果省略evaluation_edition_clause,則在名稱解析期間版本對像是不可見的。

所以我成功地測試了兩個選項來解決這個問題:

  • 選項 1 - 使同義詞 NONEDITIONABLE,在這種情況下它將對物化視圖可見或
  • 選項 2 - 在物化視圖上指定evaluation_edition_clause。

使用 CREATE MATERIALIZED VIEW 語句創建物化視圖。物化視圖是包含查詢結果的數據庫對象。查詢的 FROM 子句可以命名表、視圖和其他物化視圖。 更多的

您不能從 Synonym 創建物化視圖。我不知道您為什麼要這樣做,但我們創建物化視圖作為您的工作範例。

引用自:https://dba.stackexchange.com/questions/153541