什麼是Database Links呢? 首先我們闡述下它的作用:使用戶可以通過一個數據庫訪問到另外一個遠程數據庫。 那麼Database Link是存儲著遠程數據庫的連接信息。
如下圖所示:
用戶Scott可以在本地數據庫上查詢遠程數據庫的emp表,我們可以在我們的本地數據庫上建立一個別名(Synonym) emp,然後我們就可以直接通過select * from emp來查詢遠程數據庫上的emp表,而無需通過select * from [email protected]的方式來查詢。
這個遠程的數據庫可以是任何Oracle支持的遠程數據庫:Oracle ,DB2, SQL Server, Taradata, MySQL…等等。 後面我還會介紹相關如何連接到非Oracle產品的數據庫。
好了,知道了Database Link是什麼,干什麼用,Database Link的本質等,接下來我們介紹Database Link有哪幾種連接方式的Link:
Link類型
說明
Connected user link
看這個類型的名稱就可以判斷出,用的是當前連接的用戶的帳戶及其密碼來訪問遠程數據庫的。所以這個類型就要求需要在遠程數據庫上有一個和本地帳戶一樣的username和passWord.
Fixed user link
這個類型是說使用指定的帳戶和密碼來訪問遠程數據庫。所以只需指定的帳戶能夠有權限訪問遠程數據庫就可以。
Current user link
需要用戶連接到本地數據庫的時候是全局用戶的身份連接的。這樣這個全局用戶就可以使用指定帳戶的上下文,而無需存儲密碼信息到link中。
上面是用來告訴Database Link,我們用用什麼身份連接。
Database Link有以下類型:
類型
說明
Private
來類型的Database Lin只能由這個Database Link的Owner才能使用它。
Public
在這個數據庫裡的所有用戶均可使用該Database Link
Global
網絡中的數據庫中的用戶均可使用該database link. 因為當Oracle 使用目錄服務器的時候,它會在該目錄下的所有數據庫裡都創建這個 global database link,並且統一控制。因此所有在目錄下的數據庫裡的用戶均可使用。
好了,讓我們看看應該如何創建一個Database Link:
語法:create [type] database link
語句
說明
訪問方式類型
連接類型
Create database link dblinkName using ‘NSName’;
創建一個database link ,通過使用網絡服務名稱創建。其中Database Link的名稱為dbLinkName. 網絡服務的名稱為NSName.
Connected user link
Private
Create public database link dblinkName connect to CURRENT_USER using ‘NSName’;
創建一個database link ,通過使用網絡服務名稱創建。其中Database Link的名稱為dbLinkName. 網絡服務的名稱為NSName.
Current user link
public
Create database link dblinkName dblinkName connect to username identifIEd by passWord using ‘NSName’;
創建一個database link ,通過使用網絡服務名稱創建。其中Database Link的名稱為dbLinkName. 網絡服務的名稱為NSName. 通過用戶帳戶username及其密碼passWord來訪問遠程數據庫。
Fixed user link
private
上面的地NSName的創建方式是需要在Oracle_home/Network/admin/tnsnames.ora裡面配置。超出了本文的范圍,我暫不做介紹。
如果不清楚如何配置NSName,那麼我們可以按照以下方式寫:
Create database link dblinkName dblinkName connect
to username identifIEd by passWord using ‘NSNName=
(
Address_List=
(
(Adress=(protocol=TCP)(host=RemoteServerName)(port=1521))
)
(Connect_Data=(services_Name))
)’
其中protocol 是使用得訪問協議;RemoteServerName是遠程數據庫的服務器名稱或者IP, port是遠程服務器裡Oracle監視的端口(可以使另一個Oracle 數據庫或者 Oracle Gateway,關於Oracle Gateway會在後續講解)。 Services_Name是遠程服務器提供的服務名稱。 例如:遠程服務器RemoteA,安裝了Oracle Database ,它的監聽端口是1521, 並且數據庫服務的名稱是orcl 則以上的語句改寫如下:
Create database link dblinkName dblinkName connect
to username identifIEd by passWord using ‘NSNName=
(
Address_List=
(
(Adress=(protocol=TCP)(host=RemoteA)(port=1521))
)
(Connect_Data=(orcl))
)’
好了,以上簡單的介紹了如何Oracle Database Link的類型和訪問方式類型,及如何創建database link.
那麼創建完,使用如下: (在訪問權限滿足的條件下)
Select * from remoteTableName@dblinkName;
其中remoteTableName是要訪問的遠程數據庫裡的表的名稱,dblinkName既是先前我們創建的數據庫連接。 這樣每次訪問表,寫起來都有點麻煩;而且對於普通用戶,這樣的接口可能我們並不提供,換句話說,我們可能只讓用戶知道這裡有什麼表或者視圖就可以了。這個時候我們可以使用別名(synonym)來簡化/隱藏接口,語法如下
CREATE [PUBLIC] synonym_nameFOR [schema.]object_name[@database_link_name];
Synonym支持一下的對象:
◆Tables
◆Types
◆VIEws
◆Materialized vIEws
◆Sequences
◆Procedures
◆Functions
◆Packages
這裡不做過多的講解,我們為先前我們創造的database link來創建一個synonym,代碼如下:
Create public tableName for remoteTableName@dblinkName;
創建完成後,我們就可以這樣訪問遠程數據庫裡的表:
Select * from tableName;
上述語句等價於
Select * from remoteTableName@dblinkName;