倆臺不同的數據庫服務器,從一臺數據庫服務器的一個用戶讀取另一臺數據庫服務器下的某個用戶的數據,這個時候可以使用dblink。
其實dblink和數據庫中的view差不多,建dblink的時候需要知道待讀取數據庫的ip地址,ssid以及數據庫用戶名和密碼。
創建可以采用兩種方式:
1、已經配置本地服務
以下是引用片段:
create public database
link fwq12 connect to fzept
identified by neu using 'fjept' |
CREATE DATABASE LINK + 數據庫鏈接名(
以后就通過這個名字來進行調用遠程數據庫的內容。)CONNECT TO + 用戶名(
是用來連接到遠程數據庫的合法Oracle用戶名) IDENTIFIED BY + 密碼(
為該用戶連接到Oracle時候的合法密碼) USING + 本地配置的數據的實例名(
為該Oracle數據庫所在的主機上的tnsnames.ora文件里邊定義的數據庫連接串);
在安裝目錄下,如:E:\Oracle\Ora81\network\ADMIN下用寫字板或記事本打開TNSNAME.ORA文件,
SELECT COUNT(*) FROM TABLE_NAME@DB_LINK WHERE WHERE_CLAUSE;//
查閱遠程數據庫的內容。
UPDATE TEST.TEST@DB_LINK SET SO_NBR=NEW_SO_NBR WHERE WHERE_CLAUSE;//修改遠程數據庫的內容。
在實際使用過程中,還可以通過為這個遠程表建立一個同義詞來進一步增加透明性,使該數據庫連接串對于程序和開發人員來講完全透明。
CREATE SYNONYM TABLE_NAME FOR TABLE_NAME@DB_LINK;
2、未配置本地服務
以下是引用片段:
create database link linkfwq
connect to fzept identified by neu
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.142.202.12)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = fjept)
)
)'; |
host=數據庫的ip地址,service_name=數據庫的ssid。
其實兩種方法配置dblink是差不多的,我個人感覺還是第二種方法比較好,這樣不受本地服務的影響。
數據庫連接字符串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA里定義.
數據庫參數global_name=true時要求數據庫鏈接名稱跟遠端數據庫名稱一樣
數據庫全局名稱可以用以下命令查出
SELECT * FROM GLOBAL_NAME;
查詢遠端數據庫里的表
SELECT …… FROM 表名@數據庫鏈接名;
查詢、刪除和插入數據和操作本地的數據庫是一樣的,只不過表名需要寫成“表名@dblink服務器”而已。
附帶說下同義詞創建:
CREATE SYNONYM同義詞名FOR 表名;
CREATE SYNONYM同義詞名FOR 表名@數據庫鏈接名;
刪除dblink:DROP PUBLIC DATABASE LINK linkfwq。
如何知道當前用戶、當前系統中有哪些數據庫連接串?
SELECT * FROM USER_DB_LINKS;
這個查詢會給出當前用戶的數據庫聯接的名字、聯接用戶名、聯接密碼、要連接的主機以及創建時期。
SELECT * FROM DBA_DB_LINKS;
這個查詢會給出當前系統中所有的數據庫聯接的創建用戶、聯接用戶名、要連接的主機以及創建時期。
SELECT * FROM V$DBLINK;
這個查詢會給出當前打開的數據庫聯接。
4。常見錯誤處理:
////////////////////////////////////////////////////////////////
1。不能分解服務名:
登錄到遠程服務器上的結果:
net97>show parameters global_name
NAME TYPE VALUE
------------------------------------ ------- ------------------------------
global_names boolean FALSE
net97>
net97>drop database link jinhua;
數據庫鏈接已丟棄。
net97>create database link jinhua
2 connect to username identified by password
3 using 'jinhua';
數據庫鏈接已創建。
net97>select * from so@jinhua;
select * from so@jinhua
*
ERROR 位于第 1 行:
ORA-12154: TNS:不能分解服務名稱.
net97>conn username/password@jinhua;
已連接。
net97>
這是因為在Oracle數據庫所在的Unix主機上面的tnsnames.ora文件里邊沒有對jinhua這個服務名的定義。所以不能分解服務名。
如果創建全局dblink,必須使用systm或sys用戶,在database前加public。
參考資料:
http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14231/ds_admin.htm#i1008271