當用戶要跨本地數據庫,訪問另一個數據庫表中的數據時,本地數據庫中必須建立了遠程數據庫的dblink,經過dblink本地數據庫能夠像訪問本地數據庫同樣訪問遠程數據庫表中的數據。本文主要介紹關於dblink的常見操做和相關的一點oracle操做。sql
在建立dblink以前,首先要查看用戶是否有相應的權限。針對特定的用戶,使用 sqlplus user/pwd登陸後,執行以下語句:數據庫
select * from user_sys_privs t where t.privilege likeupper('%link%');oracle
在sys用戶下,顯示結果爲:ide
SYS CREATE DATABASE LINK NOspa
SYS DROP PUBLIC DATABASE LINK NOorm
SYS CREATE PUBLIC DATABASE LINK NOip
能夠看出在數據庫中dblink有三種權限:get
CREATE DATABASE LINK--所建立的dblink只能是建立者能使用,別的用戶使用不了it
CREATE PUBLIC DATABASE LINK--public表示所建立的dblink全部用戶均可以使用io
DROP PUBLIC DATABASE LINK--刪除指定dblink
若是想要改變某個用戶的權限,須要在sys用戶下修改:
grantCREATEPUBLICDATABASE LINK,DROPPUBLICDATABASE LINK to scott;
肯定具有了相應的權限之後,登陸sqlplus便可對dblink進行相應的操做了。
1. 查看dblink,有兩種方式,分別以下:
select owner,object_name from dba_objects where object_type='DATABASE LINK';
2. 建立dblink,也有兩種方式。
第一種是使用tnsnames.ora配置文件添加相關配置信息,形如:
chose_you_like =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = yourOracleServiceName)
)
)
而後在sqlplus終端下執行:
createpublicdatabase link link_name connecttouser identified by pwd using 'chose_you_like';
第二種是直接在sql語句中使用配置信息,語法格式以下:
createpublicdatabase link link_name connecttouser identified by pwd
using
'(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = yourOracleServerName)
)
)';
這裏的user和pwd爲指定的oracle數據庫中的用戶名和密碼,SERVICE_NAME若是不肯定的話,能夠經過如下語句得到:
show parameter service_names;
或者
select name,valuefrom v$parameter where name='service_names'
SERVICE_NAME的值必須與源數據庫保持一致,不然dblink建立成功後訪問時會報錯,錯誤提示以下:
ORA-12514: TNS: listener does not currently know of service requested inconnectdescriptor
3. 使用dblink
dblink的使用相對比較簡單,把通常訪問本地表時的表名改成以下格式便可:[user.]table@link_name。例如,在本機數據庫上建立了一個scott_dblink的public dblink(使用遠程主機
的scott用戶鏈接),則用sqlplus鏈接到本機數據庫,執行select * from scott.emp@scott_rmthot便可以將遠程數據庫上的scott用戶下的emp表中的數據獲取到。也能夠在本地建一個同義
詞來指向scott.emp@scott_rmthost,方便平常的使用。
4. 刪除dblink
肯定要刪除的dblink名字之後,能夠經過drop命令直接將其刪除: