天天看點

Oracle基礎——dblink

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)起作用的,其他使用者無法使用這個連接配接,無權限也不能删除它。