【DB筆試面試520】在Oracle中,Oracle的DBLINK是什麼?

  • 2019 年 10 月 8 日
  • 筆記

題目部分

在Oracle中,Oracle的DBLINK是什麼?

答案部分

當用戶要跨本地數據庫訪問另外一個數據庫表中的數據時,本地數據庫中必須創建了遠程數據庫的DBLINK,通過DBLINK可以像訪問本地數據庫一樣訪問遠程數據庫表中的數據。其實,DBLINK和數據庫中的VIEW差不多,創建DBLINK的時候需要知道待讀取數據庫的IP地址、ORACLE_SID以及數據庫用戶名和密碼。

在創建DBLINK之前,普通用戶必須具有相關的權限才能創建DBLINK,以SYS用戶登錄到本地數據庫可以看到相關的權限:

SELECT * FROM USER_SYS_PRIVS T WHERE T.PRIVILEGE LIKE UPPER('%LINK%');

可以看出,在數據庫中DBLINK有3種權限:CREATE DATABASE LINK(所創建的DBLINK只能是創建者自己使用,別的用戶不能使用)、CREATE PUBLIC DATABASE LINK(PUBLIC表示所創建的DBLINK所有用戶都可以使用)與DROP PUBLIC DATABASE LINK(刪除公共的DBLINK)。可以使用如下授權語句給用戶SCOTT授予CREATE PUBLIC DATABASE LINK和DROP PUBLIC DATABASE LINK兩個權限:

GRANT CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK TO SCOTT;

查詢數據庫的DBLINK可以使用SQL語句:SELECT * FROM DBA_DB_LINKS。

DBLINK的分類如下表所示:

類型

用戶

描述

Private

創建database link的user擁有該database link

在本地數據庫的特定的schema下建立的database link。只有建立該database link的schema的用戶才能使用這個database link來訪問遠程的數據庫。同時也只有創建者才能刪除它自己的private database link。

Public

Owner是PUBLIC

Public的database link是數據庫級的,本地數據庫中所有的擁有數據庫訪問權限的用戶或pl/sql程序都能使用此database link來訪問相應的遠程數據庫。

Global

Owner是PUBLIC

Global的database link是網絡級的。此時的global_names必須設置為true。

database link用戶驗證方法包括3種,分別為current user、fixed user和connected user,如下表所示:

創建命令

用戶驗證方式

不指定

默認值採取Connected User的驗證方法

CONNECT TO CURRENT_USER

採取CURRENT_USER的驗證方式

CONNECT TO user_name IDENTIFIED BY password

採取Fiexed User的驗證方式

舉例如下:

DBLINK的創建命令

用戶驗證方式

CREATE database link DBL_sales USING 'sales_us';

Private connected user

CREATE database link DBL_foo CONNECT TO CURRENT_USER USING 'am_sls';

Private current user

CREATE database link DBL_salesCONNECT TO scott IDENTIFIED BY tiger USING 'sales_us';

Private fixed user

CREATE PUBLIC database link DBL_sales CONNECT TO scottIDENTIFIED BY tiger USING 'rev';

Public fixed user

CREATE SHARED PUBLIC database link DBL_salesCONNECT TO scott IDENTIFIEDBY tiger AUTHENTICATED BYanupam IDENTIFIED BY bhide USING 'sales';

Shared public fixed user

創建DBLINK一般有兩種方式,第一種方式是在本地數據庫tnsnames.ora文件中配置了要遠程訪問的數據庫的TNS,例如這裡配置了TNS_BJLHR,然後創建公共DBLINK:

CREATE PUBLIC DATABASE LINK

DBL_BJLHR CONNECT TO SCOTT IDENTIFIED BY TIGER USING 'TNS_BJLHR';

其中,DBL_BJLHR是創建的DBLINK名字,SCOTT/TIGER是登錄到遠程數據庫的用戶名/密碼,然後在本地數據庫中通過DBLINK訪問遠程數據庫「TNS_BJLHR」中SCOTT.TB_TEST表,SQL語句如下所示:

SELECT * FROM SCOTT.TB_TEST@DBL_BJLHR;

創建DBLINK的第二種方式,是在本地數據庫tnsnames.ora文件中沒有配置要訪問的遠程數據庫的時候,而直接將相關的內容寫到DBLINK的配置中,如下所示:

CREATE DATABASE LINK DBL_BJLHR

CONNECT TO SCOTT IDENTIFIED BY TIGER

USING '(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.10)(PORT = 1521))

)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = BJLHR)

)

)';

其中,HOST為數據庫的IP地址,SERVICE_NAME為數據庫的SID,其實,兩種方法配置DBLINK是差不多的,第二種方法不受本地服務的影響。

另外,當數據庫參數GLOBAL_NAMES為TRUE時,要求數據庫鏈接名稱跟遠端數據庫名稱一樣。數據庫全局名稱可以用以下命令查出:

SELECT * FROM GLOBAL_NAME;

用以下語句來修改參數值:

ALTER SYSTEM SET GLOBAL_NAMES=FALSE/TRUE;

當數據庫參數GLOBAL_NAMES為FALSE時,就不要求數據庫鏈接名稱跟遠端數據庫名稱一樣。

需要注意的是,對於Private類型的dblink,只有其創建者才能刪除dblink。如果是Public的dblink,那麼只要有「DROP PUBLIC DATABASE LINK」的權限就可以刪除dblink:

SYS@PROD1> create database link sh.prod2_2 connect to sh identified by sh using 'PROD2';

Database link created.

SYS@PROD1> COL DB_LINK FORMAT A10

SYS@PROD1> COL HOST FORMAT A10

SYS@PROD1> COL OWNER FORMAT A10

SYS@PROD1> COL USERNAME FORMAT A10

SYS@PROD1> select * from dba_db_links d WHERE D.db_link LIKE '%PROD2_2%';

OWNER DB_LINK USERNAME HOST CREATED

---------- ---------- ---------- ---------- ---------

SYS SH.PROD2_2 SH PROD2 15-DEC-17

SYS@PROD1> conn sh/sh

Connected.

SH@PROD1> create database link prod2 connect to sh identified by sh using 'PROD2';

Database link created.

SH@PROD1> conn / as sysdba

Connected.

SYS@PROD1> drop database link sh.PROD2;

drop database link sh.PROD2

*

ERROR at line 1:

ORA-02024: database link not found

& 說明:

有關Oracle Dblink的更多內容介紹可以參考我的BLOG:http://blog.itpub.net/26736162/viewspace-2148696/

本文選自《Oracle程序員面試筆試寶典》,作者:李華榮。