Oracle

在沒有PK的表上通過dblink創建快速刷新MV?

  • December 11, 2020

我想通過 dblink 在主系統(Oracle 18c)和外部系統(Oracle 19c)之間創建一個物化視圖。

  • MV 將按 30 秒的計劃刷新(因為通過 dblink 無法進行 on-commit)。
  • 外部系統中的表沒有主鍵。

我是新手。這是我嘗試過的:

--in the external system:  
create materialized view log on external_system.workorder with rowid;  


--in the primary system:
create materialized view primary_system.workorder_mv
build immediate 
refresh fast 
start with sysdate next sysdate + (30/(60*60*24))
as
select
   cast(workorderid as number(38,0)) as objectid,
   wonum,
   status,
   --other fields
   longitudex,
   latitudey
from
   external_system.workorder@gistomax

當我嘗試上述方法時,我收到一連串錯誤,從一個說我需要主鍵的錯誤開始。

我發現一個頁面表明可以通過 dblink 進行快速刷新。但該範例使用主鍵,而不是 rowid。

文件說

在主表重組後,在執行完全刷新之前,Rowid 物化視圖不符合快速刷新的條件。

但我真的不知道那是什麼意思。老實說,我對此很陌生,我知道我找錯了樹,所以我會停在那裡。


問題:

是否可以通過沒有 PK 的表上的 dblink 創建快速刷新 MV?

正如您在另一個問題中已經證明的那樣,列上的唯一約束NOT NULL足以創建具有“PK”值的 mview 日誌。這可用於快速刷新。

SQL> conn bp/bp
Connected.
SQL> create database link self connect to bp identified by bp
    using 'localhost:1521/RYMIN19';

Database link created.

SQL> create table t1 (c1 number not null unique, c2 number);

Table created.

SQL> create materialized view log on t1 with primary key;

Materialized view log created.

SQL> create materialized view mv1 refresh fast on demand as select * from t1@self;

Materialized view created.

SQL> insert into t1 values (1, 1);

1 row created.

SQL> insert into t1 values (2, 2);

1 row created.

SQL> commit;

Commit complete.

然後:

SQL> exec dbms_mview.refresh('MV1', 'f');

PL/SQL procedure successfully completed.

SQL> select last_refresh_type from user_mviews where mview_name = 'MV1';

LAST_REF
--------
FAST

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