oracle建立dblink

當用戶要跨本地數據庫,訪問另外一個數據庫表中的數據時,本地數據庫中必須創建了遠程數據庫的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有三種權限CREATE DATABASE LINK(所創建的dblink只能是創建者能使用,別的用戶使用不了),CREATE PUBLIC DATABASE LINK(public表示所創建的dblink所有用戶都可以使用),DROP PUBLIC DATABASE LINK。

  在sys用戶下,把CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK權限授予給你的用戶

  grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to scott;

  然後以scott用戶登錄本地數據庫

  1.創建dblink的第一種方式,是在本地數據庫tnsnames.ora文件中配置了要遠程訪問的數據庫。

  create public database link

  to_bylw connect to scott identified by tiger using 'bylw';

  其中to_bylw是你創建的dblink名字,bylw是遠程數據庫的實例名,scott/tiger是登錄到遠程數據庫的用戶/密碼。然後在本地數據庫中通過dblink訪問遠程數據庫'bylw'中scott.tb_test表,sql語句如下所示

  select * from scott.tb_test@to_bylw;

  2.創建dblink的第二種方式,是在本地數據庫tnsnames.ora文件中沒有配置要訪問的遠程數據庫,

  create database link to_test

  connect to scott identified by tiger

  using '(DESCRIPTION =

  (ADDRESS_LIST =

  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.5)(PORT = 1521))

  )

  (CONNECT_DATA =

  (SERVER = DEDICATED)

  (SERVICE_NAME = bylw)

  )

  )';

  第二種是把第一種配置在tnsnames.ora文件中的信息,直接放在創建dblink語句後面。第一種情況tnsnames.ora文件中信息如下:

  bylw =

  (DESCRIPTION =

  (ADDRESS_LIST =

  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.5)(PORT = 1521))

  )

  (CONNECT_DATA =

  (SERVER = DEDICATED)

  (SERVICE_NAME = bylw)

  )

  )

 

刪除數據庫鏈接的語句是:
DROP DATABASE LINK to_bylw;

 

數據庫鏈接的引用
一般情況下引用數據庫鏈接,可以直接將其放到調用的表名或視圖名稱後面,中間使用一個 @ 作爲分割符:
SELECT * FROM worker@to_bylw;
對於經常使用的數據庫鏈接,可以建立一個本地的同義詞,方便使用:
CREATE SYNONYM worker_syn FOR worker@to_bylw;
還可以建立一個本地的遠程視圖,方便使用:
CREATE VIEW worker AS SELECT * FROM worker@to_bylw where… ;
現在本視圖可與本地數據庫中的任何其它視圖一樣對待,也可以授權給其它用戶,訪問此視圖,但該用戶必須有訪問數據庫鏈接的權限。

 

對於另外一種情況,所要訪問的表不在數據庫鏈接中指定的遠程帳戶下,但該帳戶有訪問該表的權限,那麼我們在表名前要加上該表的用戶名:
SELECT * FROM catter.worker@to_bylw;   --其中catter是另一個有權限訪問的用戶名

 

當數據庫參數global_name=true時,那就要求數據庫鏈接名稱跟遠端數據庫名稱一樣
數據庫全局名稱可以用以下命令查出
SELECT * FROM GLOBAL_NAME;

發佈了46 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章