作用:将多個不同地點的伺服器的oracle資料庫邏輯上看成一個資料庫,也就是說在一個資料庫中可以操作另一個遠端的資料庫中的對象。
文法:
CREATE [PUBLIC] DATABASE LINK dblink CONNECT TO user IDENTIFIED BY password USING ‘connect_string‘;
DROP [PUBLIC] DATABASE LINK dblink;
注意:你必須有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的權限(可用sys身份去配置設定),另外,在你要連接配接的資料庫上的權限.
grant CREATE DATABASE LINK to hr;
參數說明:
dblink: 你所建立的database link的名字,
user和password:要連接配接的資料庫的使用者名和密碼
connect_string:可以是經過Net Manager配置的(tnsnames.ora)且經測試可以連接配接的服務名,不過也更直接用tnsnames裡的字元串:(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = even.oracle.com)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME =orcl) )
通過SHOW PARAMETER GLOBAL_NAMES,可以檢視到其值是FALSE或者TRUE。
一)對于GLOBAL_NAMES=FALSE的情況,則DBLINK的名稱可以自定義,相關的過程如下:
實作從本地資料庫連接配接到遠端資料庫伺服器:
遠端伺服器要配置監聽并且啟動它
本地伺服器要配置tnsnames
實作在本地伺服器上連接配接到遠端伺服器資料庫:
在本地資料庫上,建立連接配接:
1、 連結字元串即服務名,首先在本地配置一個服務名,位址指向遠端的資料庫位址,當然也直接寫的連接配接字元串。
2、建立資料庫連結(前提是已配置設定相應權限),
SQL> grant CREATE DATABASE LINK to hr;
Grant succeeded.
SQL> CREATE DATABASE LINK LinkRemoteTestDB CONNECT TO hr IDENTIFIED BY hr USING 'test';
Database link created.
當然也可以直接寫連接配接字元串
SQL>create database link LinkRemoteTestDB2 connect to hr identified by hr
using 'TEST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = even.oracle.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = test)
)
)';
則建立了一個以hr使用者和TEST資料庫的連結LinkRemoteTestDB.
3.使用database link來查詢遠端HR schema下的testdblink 表資訊
SQL> select * from [email protected];
ID NAME
---------- ----------------------------------------
1 Watson
2 John
通過執行select * from [email protected]; 進行測試,結果OK
二)對于GLOBAL_NAMES = TRUE的情況,資料庫連結(DATABASE LINK)的名字必須和資料庫的名字相同:
在本地伺服器上執行下面語句使GLOBAL_NAMES=TRUE:
SQL>ALTER SYSTEM SET GLOBAL_NAMES=TRUE;
再查詢時,會有如下的錯誤:
SQL> select * from [email protected];
select * from [email protected]
*
ERROR at line 1:
ORA-02085: database link LINKREMOTETESTDB.REGRESS.RDBMS.DEV.US.ORACLE.COM
connects to TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM
登入遠端資料庫,通過執行
SQL>SELECT * FROM GLOBAL_NAME;得到其資料庫全名為TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM
用原方式SQL> CREATE DATABASE LINK LinkRemoteTestDB CONNECT TO hr IDENTIFIED BY hr USING 'test';建立過程不會出錯,但執行“select * from
[email protected];”的時候,就會出現ORA-02085: database link LINKREMOTETESTDB.REGRESS.RDBMS.DEV.US.ORACLE.COM
connects to TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM的錯誤了
是以需要采用下面的方式建立DBLINK:
SQL> create database link TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM connect to HR identified by HR using 'TEST';
Database link created.再次執行
SQL> select * from [email protected];
ID NAME
---------- ----------------------------------------
1 Watson
2 John
SQL> UPDATE [email protected] t set t.name='WatsonModified' where id=1;
1 row updated.
SQL> select * from [email protected];
ID NAME
---------- ----------------------------------------
1 WatsonModified
2 John
執行成功了!!!!!
DBLINK其他相關的知識:
1、檢視所有的資料庫連結
SQL>select owner,object_name from dba_objects where object_type='DATABASE LINK';
SQL>select * from dba_db_links;
2、删除資料庫連接配接
SQL> drop database link LinkRemoteTestDB;
Database link dropped.
例子:
create public database link tblink
connect to EM identified by em123456
using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 172.24.105.70)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl)))';
select * FROM [email protected];
exp_requisition_headers
drop public database link tblink;