dblink:
dblink(Database Link)資料庫連結,顧名思義就是資料庫的連結。就像電話線一樣,是一個通道,當我們要跨本地資料庫,通路另外一個資料庫表中的資料時,本地資料庫中就必須要建立遠端資料庫的dblink,通過dblink本地資料庫可以像通路本地資料庫一樣通路遠端資料庫表中的資料。
建立dblink文法:
建立dblink一般有兩種方式,不過在建立dblink之前使用者必須有建立dblink的權限。想知道有關dblink的權限,以sys使用者登入到本地資料庫: select * from user_sys_privs t
where t.privilege like upper('%link%'); 查詢結果集 :
1 SYS CREATE DATABASE LINK NO
2 SYS DROP PUBLIC DATABASE LINK NO
3 SYS CREATE PUBLIC DATABASE LINK NO
可以看出在資料庫中dblink有三種權限: 1.CREATE DATABASE LINK(所建立的dblink隻能是建立者能使用,别的使用者使用不了) ,
2.CREATE PUBLIC DATABASE LINK(public表示所建立的dblink所有使用者都可以使用),
3.DROP PUBLIC DATABASE LINK。
在sys使用者下,把CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASELINK權限授予給你的使用者: grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to scott; 然後以scott使用者登入本地資料庫
1、已經配置本地服務
create public database link link_name
connect to username identified by password using 'connect_string'; 注:link_name是連接配接名字,可以自定義; username是登陸資料庫的使用者名; password是登陸資料庫的使用者密碼; connect_string是資料庫連接配接字元串。 資料庫連接配接字元串是目前用戶端資料庫中TNSNAMES.ORA檔案裡定義的别名名稱.可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA裡定義.
2、直接建立連結
create database link link_name
connect to username identified by password
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = X.X.X.X )(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = SSID)
)
)';
host=資料庫的ip位址,service_name=資料庫的ssid。
其實兩種方法配置dblink是差不多的,個人感覺還是第二種方法比較好,這樣不受本地服務的影響。
注意: 假如建立全局dblink,則必須使用systm或sys使用者,在database前加public。
說明: 1) 權限:建立資料庫連結的帳号必須有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系統權限,用來登入到遠端資料庫的帳号必須有CREATE SESSION權限。這兩種權限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK權限在DBA中)。一個公用資料庫連結對于資料庫中的所有使用者都是可用的,而一個私有連結僅對建立它的使用者可用。由一個使用者給另外一個使用者授權私 有資料庫連結是不可能的,一個資料庫連結要麼是公用的,要麼是私有的。 2)link : 當source端的參數(parameter)GLOBAL_NAMES=TRUE時,link名必須與遠端資料庫的全局資料庫名global_name)相同;否則( GLOBAL_NAMES=FALSE),可以任意命名。 3)current_user使用該選項是為了建立global類型的dblink。在分布式體系中存在多個資料庫的話。如果想要在每一個資料庫中都可以使用同樣的名字來通路資料庫a,那在每個資料庫中都要建立一個到資料庫a的db_link,太麻煩了。是以有這個選項的話你隻要建立一次。所有的資料庫都可以使用這個db_link來通路了。要使用這個特性,必須有oracle nameserver或者ORACLE目錄伺服器。并且資料庫a的參數global_names=true.具體我也沒有建立過,沒有這個環境。 4)connectstring:連接配接字元串,tnsnames.ora中定義遠端資料庫的連接配接串,也可以在建立dblink的時候直接指定。 5)username、password:遠端資料庫的使用者名,密碼。如果不指定,則使用目前的使用者名和密碼登入到遠端資料庫,當建立connected user類型的dblink時,需要如果采用資料字典驗證,則需要兩邊資料庫的使用者名密碼一緻。
修改GLOBAL_NAME的方法:
1.在遠端資料庫的init.ora檔案中将global_names設為false。
或者
2.用sys使用者執行如下語句:ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALSE;
修改後重新啟動資料庫設定才能生效。
資料庫全局名稱可以用以下指令查出:SELECT * FROM GLOBAL_NAME;
dblink查詢
檢視所有的資料庫連結,進入系統管理者SQL>操作符下,運作指令: SQL>select owner,object_name from dba_objects where object_type='DATABASE LINK';
或者 select * from dba_db_links;
dblink删除
DROP PUBLIC DATABASE LINK link_name;
dblink使用
SELECT……FROM 表名@資料庫連結名; 查詢、删除和插入資料和操作本地的資料庫是一樣的,隻不過表名需要寫成“表名@dblink伺服器”而已。 例:查詢北京資料庫中emp表資料 select * from [email protected]; 設此處北京資料庫的資料庫連接配接字元串為BeiJing;
同義詞配合
例子中from [email protected]可以建立同義詞來替代:
CREATE SYNONYM 同義詞名 FOR 表名; CREATE SYNONYM 同義詞名 FOR 表名@資料庫連結名; 如:create synonym bj_scott_emp for [email protected]; 于是就可以用bj_scott_emp來替代帶@符号的分布式連結操作[email protected]
DB LINK是獨立于建立使用者(USER_DB_LINKS的USERNAME)起作用的,其他使用者無法使用這個連接配接,無權限也不能删除它。