建立遠端基表的物化檢視

georgehmwang發表於2015-01-20
當使用者要跨本地資料庫,訪問另外一個資料庫表中的資料時,本地資料庫中必須建立了遠端資料庫的dblink,
透過dblink本地資料庫可以像訪問本地資料庫一樣訪問遠端資料庫表中的資料。

在建立dblink之前使用者必須有建立dblink的許可權。想知道有關dblink的許可權,以sys使用者登入到本地資料庫:

如何檢視Global_name引數是true還是False? 當資料庫引數global_name=false時,就不要求資料庫連結名稱跟遠端資料庫名稱一樣。
SQL> show parameter global_name;
NAME                          TYPE     VALUE
---------------------------- ----------- ------------------------------
global_names                 boolean     FALSE

SQL> select * from v$option where PARAMETER='Advanced replication';
PARAMETER         VALUE
-------------------- -----------------------------------------
Advanced replication TRUE

SQL> select * from user_sys_privs t where t.privilege like upper('%link%');
USERNAME               PRIVILEGE                ADM
------------------------------ ---------------------------------------- ---
SYS                   DROP PUBLIC DATABASE LINK        NO
SYS                   CREATE DATABASE LINK            NO
SYS                   CREATE PUBLIC DATABASE LINK        NO

可以看出在資料庫中dblink有三種許可權CREATE DATABASE LINK(所建立的dblink只能是建立者能使用,別的使用者使用不了),
CREATE PUBLIC DATABASE LINK(public表示所建立的dblink所有使用者都可以使用)和DROP PUBLIC DATABASE LINK。

在以下建立物化檢視的例子中,基表是遠端資料庫所帶的HR Schema中的employees表。擁有基表的使用者是hr,建立物化檢視的使用者是george。

==================================================================
建立遠端基表的on demand refresh物化檢視
==================================================================
物化檢視的重新整理模式有兩種:ON DEMAND和ON COMMIT。
ON DEMAND和ON COMMIT物化檢視的區別在於其重新整理方法的不同,ON DEMAND指物化檢視在使用者需要的時候進行重新整理,
可以手工透過DBMS_MVIEW.REFRESH等方法來進行重新整理,也可以透過JOB定時進行重新整理,即更新物化檢視,以保證和基表資料的一致性;
而ON COMMIT是說,一旦基表有了COMMIT,即事務提交,則立刻重新整理,立刻更新物化檢視,使得資料和基表一致。

建立使用者並授予許可權

SQL> create user george identified by george;
User created.
SQL> grant connect, resource to george;
Grant succeeded.
SQL> grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to george;
Grant succeeded

建立dblink首先在本地資料庫tnsnames.ora檔案中配置了要遠端訪問的資料庫服務別名。
接下來建立dblink
SQL> create public database link hr_remote connect to hr identified by hr using 'dg01prmy';
Database link created.
其中hr_remote是你建立的dblink名字,dg01prmy是遠端資料庫的例項名,hr/hr是登入到遠端資料庫的使用者/密碼。
然後在本地資料庫中透過dblink訪問遠端資料庫'hr_remote'中hr.employees表,sql語句如下所示
SQL> select * from hr.employees@hr_remote;
SQL> select count(*) from employees@hr_remote;
  COUNT(*)
----------
       107

在遠端資料庫建立物化檢視日誌
檢視的重新整理將採用增量重新整理的方式,為配合增量重新整理,ORACLE要求要在基表上建立物化檢視日誌。
SQL> conn hr/hr
SQL> create materialized view log on employees with primary key including new values;

建立物化檢視
SQL> create materialized view mv_employees build immediate refresh fast with primary key on commit as select * from employees@hr_remote;
 create materialized view mv_employees build immediate refresh fast with primary key on commit as select * from employees@hr_remote
                                                                                                               *
ERROR at line 1:
ORA-01031: insufficient privileges

建立物化檢視需要的許可權 以sysdba授權
SQL> grant create any materialized view to george;
Grant succeeded.
SQL> conn george/george
Connected.

注意:設定REFRESH ON COMMIT的物化檢視不能訪問遠端物件。
SQL> create materialized view mv_employees build immediate refresh fast with primary key on commit as select * from employees@hr_remote;
create materialized view mv_employees build immediate refresh fast with primary key on commit as select * from employees@hr_remote
                                                                                                               *
ERROR at line 1:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view

SQL> create materialized view mv_employees build immediate refresh fast with primary key as select * from employees@hr_remote;

Materialized view created.
SQL> select count(*) from mv_employees;
  COUNT(*)
----------
       107


Tips:
物化檢視的重新整理
(1)使用dbms_mview.refresh 手工重新整理
如:
    EXEC DBMS_MVIEW.REFRESH('mv_employees');  
       
    --完全重新整理  
    EXEC DBMS_MVIEW.REFRESH(LIST => 'mv_employees',METHOD => 'C');  
    EXEC DBMS_MVIEW.REFRESH(LIST => 'mv_employees',METHOD => 'C');

    EXEC DBMS_MVIEW.REFRESH('mv_employees','C');  
       
    --快速重新整理  
    EXEC DBMS_MVIEW.REFRESH(LIST => 'mv_employees',METHOD => 'F');  
    EXEC DBMS_MVIEW.REFRESH('mv_employees','F');  

 (2)使用dbms_refresh.refresh 過程來批次重新整理MV
如果我們在建立物化檢視的過程指定start 和next time的重新整理時間,那麼Oracle 會自動建立重新整理的job,並採用dbms_refresh.refresh 的方式。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29960937/viewspace-1408603/,如需轉載,請註明出處,否則將追究法律責任。

相關文章