database link 使用 轉(zhuǎn)載
鏈接到遠(yuǎn)程數(shù)據(jù)庫
在一個(gè)分布式的環(huán)境里,數(shù)據(jù)庫鏈接是定義到其它數(shù)據(jù)庫的路徑的一個(gè)重要方法,使得遠(yuǎn)程處理天衣無縫。
要獲得數(shù)據(jù)庫鏈接的更深奧的知識,查看Oracle8i SQL Reference(Oracle8i SQL參考)和Oracle8i Concepts (Oracle8i概念手冊)。詳細(xì)資料的另一個(gè)極好的來源是Oracle8i Distributed Database Systems(Oracle8i分布式數(shù)據(jù)庫系統(tǒng)手冊)。
今天許多運(yùn)行Oracle的機(jī)構(gòu)有不止一個(gè)Oracle數(shù)據(jù)庫。有時(shí)不管原計(jì)劃是否這樣,一個(gè)數(shù)據(jù)庫中的數(shù)據(jù)可能與另一數(shù)據(jù)庫中的數(shù)據(jù)關(guān)聯(lián)。出現(xiàn)這種情況時(shí),你可以鏈接這兩個(gè)數(shù)據(jù)庫使得用戶或應(yīng)用程序可以訪問所有數(shù)據(jù),就好象它們在一個(gè)數(shù)據(jù)庫中。當(dāng)你這么做時(shí),你就有了一個(gè)分布式數(shù)據(jù)庫系統(tǒng)。
如何將兩個(gè)數(shù)據(jù)庫鏈接在一起呢?使用一個(gè)數(shù)據(jù)庫鏈接來完成。數(shù)據(jù)庫鏈接是定義一個(gè)數(shù)據(jù)庫到另一個(gè)數(shù)據(jù)庫的路徑的對象。數(shù)據(jù)庫鏈接允許你查詢遠(yuǎn)程表及執(zhí)行遠(yuǎn)程程序。在任何分布式環(huán)境里,數(shù)據(jù)庫鏈接都是必要的。
簡單案例
數(shù)據(jù)庫鏈接的目的是定義一條到遠(yuǎn)程數(shù)據(jù)庫的路徑,使你可以通過在本地執(zhí)行一條SQL語句來使用那個(gè)數(shù)據(jù)庫中的表和其它的對象。例如,你在一個(gè)遠(yuǎn)程數(shù)據(jù)庫上有一個(gè)稱之為"geographic feature name"的表,而你想在已連接到你本地?cái)?shù)據(jù)庫的情況下訪問那些數(shù)據(jù)。數(shù)據(jù)庫鏈接正是你所需要的。在建立它之前,你必須搜集如下信息:
一個(gè)網(wǎng)絡(luò)服務(wù)名稱,你的本地?cái)?shù)據(jù)庫事例能夠使用它來與遠(yuǎn)程事例相連接遠(yuǎn)程數(shù)據(jù)庫上的有效用戶名和口令網(wǎng)絡(luò)服務(wù)名稱是每一個(gè)數(shù)據(jù)庫鏈接必需的。每一次你從客戶機(jī)PC使用SQL*Plus連接到你的數(shù)據(jù)庫時(shí)都要使用服務(wù)名稱。在那些情況下,你提供給SQL*Plus的網(wǎng)絡(luò)服務(wù)名稱是通過在你的客戶機(jī)上的nsnames.ora文件中查找它們來解析的。在數(shù)據(jù)庫鏈接中使用的網(wǎng)絡(luò)服務(wù)名稱也是如此,除非是那些名字是使用駐留在服務(wù)器上的tnsnames.ora文件來解析。
在你定義數(shù)據(jù)庫鏈接時(shí)指定的用戶名和口令,用于建立與遠(yuǎn)程事例的連接。不需硬編碼用戶名和口令,建立數(shù)據(jù)庫鏈接也是可能的甚至是值得選取的。既然這樣,現(xiàn)在我們注意這個(gè)最直接的例子。
下列語句建立了一個(gè)數(shù)據(jù)庫鏈接,它允許訪問客戶帳戶,這個(gè)帳戶是事先在GNIS數(shù)據(jù)庫建好的:
CREATE DATABASE LINK GNIS
CONNECT TO GUEST IDENTIFIED BY WELCOME
USING 'GNIS';
鏈接名稱GNIS緊隨LINK關(guān)鍵字。當(dāng)連接到遠(yuǎn)程事例時(shí),CONNECT TO...IDENTIFIED子句指定UEST/WELCOME作為用戶名和口令使用 。USING子句指定通過網(wǎng)絡(luò)服務(wù)名稱GNIS建立連接。使用這一鏈接,現(xiàn)在你可以在遠(yuǎn)程數(shù)據(jù)庫上查詢數(shù)據(jù)。例如:
SQL> SELECT GFN_FEATURE_NAME
2 FROM GNIS.FEATURE_NAMES@GNIS
3 WHERE GFN_FEATURE_TYPE='falls'
4 AND GFN_STATE_ABBR='MI'
5 AND GFN_COUNTY_NAME='Alger';
GFN_FEATURE_NAME
_________________
Alger Falls
Au Train Falls
Chapel Falls
Miners Falls
Mosquito Falls
Tannery Falls
..
在SELECT語句中@GNIS緊隨表名稱,說明GNIS.FEATURE_NAMES表是在遠(yuǎn)程數(shù)據(jù)庫,應(yīng)該通過GNIS鏈接訪問,鏈接類型Oracle支持幾種不同類型的鏈接。這些類型相互重疊,有時(shí)難以通過選項(xiàng)進(jìn)行分類。當(dāng)你建立數(shù)據(jù)庫鏈接時(shí),你需要從下面選?。?
Public(公用)或Private (私有)鏈接
權(quán)限類: Fixed User(固定用戶), Connected User(連接用戶)或 Current User(當(dāng)前用戶)
Shared Link(共享鏈接)或 Not Shared Link(非共享鏈接)
每次創(chuàng)建數(shù)據(jù)庫鏈接時(shí),你要自覺不自覺地做這三種選擇。
公用鏈接與私有鏈接相對比
公用數(shù)據(jù)庫鏈接對所有的數(shù)據(jù)庫用戶開放訪問權(quán)。前面顯示的是私有數(shù)據(jù)庫鏈接,它只對建立它的用戶授權(quán)。公用數(shù)據(jù)庫鏈接更為有用,因?yàn)樗鼓悴槐貫槊恳粋€(gè)潛在用戶創(chuàng)建單獨(dú)的鏈接。為了建立一個(gè)公用數(shù)據(jù)庫鏈接,使用如下顯示的PUBLIC關(guān)鍵字:
CREATE PUBLIC DATABASE LINK GNIS
CONNECT TO GUEST IDENTIFIED BY WELCOME
USING 'GNIS';
即使這是一個(gè)公用鏈接,用戶名仍舊固定。所有使用這個(gè)鏈接的用戶都作為用戶GUEST連接到遠(yuǎn)程數(shù)據(jù)庫。
使用數(shù)據(jù)庫鏈接訪問遠(yuǎn)程表
圖1 數(shù)據(jù)庫鏈接GNIS,指明網(wǎng)絡(luò)服務(wù)名稱,鏈接PROD事例到GNIS事例中的FEATURE_NAMES表。
權(quán)限類
當(dāng)你建立一個(gè)數(shù)據(jù)庫鏈接時(shí),關(guān)于你如何授權(quán)對遠(yuǎn)程數(shù)據(jù)庫進(jìn)行訪問,有三種選擇。這三種選擇代表了數(shù)據(jù)庫鏈接的另一種分類方法。這三種類別如下:
固定用戶。為遠(yuǎn)程數(shù)據(jù)庫鏈接指定用戶名和口令,作為數(shù)據(jù)庫鏈接定義的一部分。
連接用戶。在不指定用戶名和口令時(shí)創(chuàng)建的數(shù)據(jù)庫鏈接。
當(dāng)前用戶。建立數(shù)據(jù)庫鏈接并指定CURRENT_USER關(guān)鍵字。
固定用戶數(shù)據(jù)庫鏈接是指在創(chuàng)建鏈接時(shí)為遠(yuǎn)程數(shù)據(jù)庫指定用戶名和口令。這一鏈接不管什么時(shí)候使用,也無論誰使用,都使用相同的用戶名和口令登陸到遠(yuǎn)程數(shù)據(jù)庫。到目前為止你在本文中所看到的都是固定用戶鏈接。
固定用戶鏈接,尤其是公用固定用戶鏈接的一個(gè)潛在問提是他們把遠(yuǎn)程系統(tǒng)上的同一帳戶給了許多本地用戶。從安全角度來說,如果所有的本地用戶在遠(yuǎn)程系統(tǒng)上擁有同一個(gè)帳戶,責(zé)任就要折中,這取決于用戶的數(shù)量 。如果數(shù)據(jù)丟失,幾乎不可能確定破壞是如何發(fā)生的。另一個(gè)潛在問題是公用固定用戶鏈接將對遠(yuǎn)程數(shù)據(jù)庫的訪問權(quán)給了所有的本地?cái)?shù)據(jù)庫用戶。
如果你不想在數(shù)據(jù)庫鏈接中嵌入用戶名和口令,Oracle提供給你另一個(gè)非常有用的選擇。你可以建立一個(gè)連接用戶鏈接。連接用戶鏈接是這樣的鏈接,它通過任一個(gè)正在使用該鏈接的本地?cái)?shù)據(jù)庫的用戶的用戶名和口令登陸到遠(yuǎn)程數(shù)據(jù)庫。你可以通過簡單地空出用戶名和口令來建立一個(gè)連接用戶鏈接??紤]如下定義:
CREATE PUBLIC DATABASE LINK GNIS
USING 'GNIS';
鏈接名是GNIS。它連接到遠(yuǎn)程數(shù)據(jù)庫連接時(shí)使用的網(wǎng)絡(luò)服務(wù)名稱是GNIS,但是沒有指定用戶名和口令。當(dāng)你在查詢中使用這個(gè)鏈接時(shí),它將向遠(yuǎn)程數(shù)據(jù)庫發(fā)送你當(dāng)前的用戶名和口令。例如,如果你使用AHMAD/SECRET 登陸到你的本地?cái)?shù)據(jù)庫,那么AHMAD/SECRET將是你登陸到遠(yuǎn)程數(shù)據(jù)庫時(shí)使用的用戶名和口令。
為了使用一個(gè)連接用戶鏈接,你必須在遠(yuǎn)程數(shù)據(jù)庫上有一個(gè)帳號,了解這一點(diǎn)是很重要的。不但這樣,而且你在兩個(gè)數(shù)據(jù)庫上應(yīng)使用同樣的用戶和口令。如果本地登陸使用AHMAD/SECRET,那么登陸到遠(yuǎn)程數(shù)據(jù)庫時(shí)也必須使用同樣的用戶名和口令。使用連接用戶鏈接時(shí),如果你的口令不同,你就無權(quán)登陸。
公用連接用戶數(shù)據(jù)庫鏈接尤其有用,因?yàn)槟憧梢越⒁粋€(gè)可被所有用戶訪問的鏈接,并且所有用戶被分別使用他或她自己的用戶名和口令授權(quán)。你獲得責(zé)任方面的利益,沒有將遠(yuǎn)程數(shù)據(jù)庫向你的本地?cái)?shù)據(jù)庫上的每一位用戶開放。代價(jià)是你必須在兩個(gè)數(shù)據(jù)庫上建立用戶帳戶,并且你必需確信口令保持一致。
當(dāng)前用戶鏈接通過使用CURRENT_USER關(guān)鍵字建立并且與連接用戶鏈接相似。只有當(dāng)使用Oracle Advanced Security Option(Oracle高級安全選項(xiàng))時(shí),你才能使用當(dāng)前用戶鏈接,這個(gè)鏈接只對授權(quán)使用X.509認(rèn)證的用戶有用。
共享鏈接
共享數(shù)據(jù)庫鏈接是指該鏈接的多個(gè)用戶可以共享同一個(gè)底層網(wǎng)絡(luò)連接。例如,在有四位用戶的MTS(多線程服務(wù)器)環(huán)境下,每一個(gè)共享服務(wù)器進(jìn)程都將與遠(yuǎn)程服務(wù)器有一個(gè)物理鏈接,這四位用戶共享這兩個(gè)鏈接。
表面上,共享鏈接乍一聽起來像是一件好事。在某些環(huán)境下的確如此,但是,當(dāng)你考慮使用共享鏈接時(shí),應(yīng)當(dāng)意識到這有許多局限性和警告:
如果你使用一個(gè)專用的服務(wù)器連接來連接到你的本地?cái)?shù)據(jù)庫,鏈接只能在你從那些連接中創(chuàng)建的多重會話間共享。 在MTS環(huán)境里,每一個(gè)共享服務(wù)器進(jìn)程潛在地打開一個(gè)鏈接。所有的會話被同一共享服務(wù)器進(jìn)程提供并且分享被那個(gè)進(jìn)程打開的任意共享鏈接。因?yàn)樵贛TS環(huán)境里的一個(gè)共享服務(wù)器進(jìn)程能夠服務(wù)于許多用戶連接,共享鏈接的使用可能導(dǎo)致打開的鏈接遠(yuǎn)多于所必須的鏈接。用SHARED關(guān)鍵字建立共享數(shù)據(jù)庫鏈接。還必須使用AUTHENTICATED BY 子句在遠(yuǎn)程系統(tǒng)上指定一有效的用戶名和口令。如下命令建立一個(gè)共享的、公用的、連接用戶數(shù)據(jù)庫鏈接:
CREATE SHARED PUBLIC DATABASE LINK GNIS
AUTHENTICATED BY DUMMY_USER IDENTIFIED BY SECRET
USING 'GNIS';
要獲得創(chuàng)建鏈接和管理分布式系統(tǒng)的更多資料,請查閱Oracle Technology Network (http://otn.oracle.com/)。
使用AUTHENTICATED BY子句稍微有些困擾,但是由于實(shí)現(xiàn)共享鏈接的方式安全性決定它是必須的。這個(gè)例子中的用戶名和口令DUMMY_USER/SECRET必須在遠(yuǎn)程系統(tǒng)上有效。然而,遠(yuǎn)程系統(tǒng)上使用的帳戶仍就是連接用戶的帳戶。如果我以JEFF/SECRET登陸到我的本地?cái)?shù)據(jù)庫并使用我剛建好的共享鏈接,將會發(fā)生以下一系列事件:
為了打開鏈接,Oracle使用DUMMY_USER/SECRET向遠(yuǎn)程數(shù)據(jù)庫授權(quán)。 然后,Oracle試圖使用HMAD/SECRET使我登陸到遠(yuǎn)程數(shù)據(jù)庫。共享鏈接的主要目的是減少兩個(gè)數(shù)據(jù)庫服務(wù)器之間的底層網(wǎng)絡(luò)連接數(shù)量。它們最適合于MTS環(huán)境,在那你擁有大量的通過這一鏈接訪問遠(yuǎn)程數(shù)據(jù)庫的用戶。觀念上,你想讓用戶數(shù)量超過共享服務(wù)器進(jìn)程的數(shù)量。那么你可以通過為每一共享服務(wù)器進(jìn)程打開一個(gè)鏈接而不是每位用戶打開一個(gè)鏈接的方法,節(jié)省資源。
查找關(guān)于數(shù)據(jù)庫鏈接的資料
你可以從幾個(gè)數(shù)據(jù)字典視圖中獲得建立好的數(shù)據(jù)庫鏈接的資料。DBA_DB_LINKS視圖為每一定義的鏈接返回一行。OWNER 列和DB_LINK列分別顯示了這一鏈接的所有者及名稱。對公用數(shù)據(jù)庫鏈接,OWNER列將包含'PUBLIC'。如果你建立固定用戶鏈接,用戶名應(yīng)在DBA_DB_LINKS視圖的USERNAME列里,但是口令只能從SYS.LINK$視圖中看到。默認(rèn)情況下,只有具有SELECT ANY TABLE系統(tǒng)權(quán)限的DBA能夠訪問SYS.LINK$視圖查看口令。你應(yīng)該保護(hù)訪問那個(gè)視圖的權(quán)限。ALL_DB_LINKS 視圖和 USER_DB_LINKS視圖與 DBA_DB_LINKS視圖相類似-它們分別顯示了你能夠訪問的所有鏈接及你所擁有的全部鏈接。最后,V$DBLINK動態(tài)性能視圖向你顯示出任意給定時(shí)間你-當(dāng)前用戶,打開的全部數(shù)據(jù)庫鏈接。
全局性的數(shù)據(jù)庫名稱
在分布式環(huán)境里,Oracle建議你的數(shù)據(jù)庫鏈接名應(yīng)與它們連接到的數(shù)據(jù)庫的全局性名稱相匹配。因此如果你正在連接到名稱為GNIS.GENNICK.ORG的數(shù)據(jù)庫,你應(yīng)當(dāng)將你的數(shù)據(jù)庫鏈接命名為GNIS.GENNICK.ORG
為確定數(shù)據(jù)庫的全局性名稱,以SYSTEM登陸并查詢GLOBAL_NAME視圖:
SQL> SELECT * FROM GLOBAL_NAME;
GLOBAL_NAME
_______________
GNIS.GENNICK.ORG
由于歷史的原因,默認(rèn)情況下,全局性名稱與數(shù)據(jù)庫鏈接名稱的之間的鏈接不是強(qiáng)制性的。不過,你可以通過設(shè)置GLOBAL_NAMES的初始化參數(shù)為TRUE來改變這一行為。例如:
SQL> SHOW PARAMETER GLOBAL_NAMES
NAME TYPE VALUE
________________________________________________________
global_names boolean TRUE
用于產(chǎn)生這個(gè)范例的事例要求你使用的數(shù)據(jù)庫鏈接名,必須與目標(biāo)數(shù)據(jù)庫的全局性數(shù)據(jù)庫名稱相匹配。注意與一些Oracle文檔中說的相反,關(guān)鍵是你的本地事例的GLOBAL_NAMES設(shè)置。如果你的本地事例中GLOBAL_NAMES=FALSE,你就能夠使用數(shù)據(jù)庫鏈接,而不用管它們是否與遠(yuǎn)程數(shù)據(jù)庫的全局性名稱相匹配。總的來說,如果你設(shè)置GLOBAL_NAMES=TRUE,你應(yīng)該在你的所有事例中一律這么做。
posted on 2006-09-29 15:35 康文 閱讀(2147) 評論(0) 編輯 收藏 所屬分類: 數(shù)據(jù)庫