CREATE DATABASE LINK 建立數據庫連接


CREATE DATABASE LINK語句能夠建立一個數據庫鏈接。數據庫鏈接是數據庫中的一個schema實體,它能夠容許你訪問別的庫的實體。其餘數據庫能夠不必定要是數據庫系統,然而訪問non-Oracle系統你必須使用同質的服務。
在dblink建立完成後,你就能夠在的SQL語句中經過在表、視圖和PL/SQL實體的後面加@dblink對其進行訪問了。你可使用SELECT語句對遠程數據庫的實體進行訪問,甚至可使用INSERT UPDATE DELETE或者LOCK TABLE語句。數據庫

查看現有的數據庫鏈接的視圖有如下:服務器

select * from v$dblink; select * from all_db_links; select * from dba_db_links; select * from user_db_links;

前提條件
建立私有數據庫鏈接,你必需要有CREATE DATABASE LINK權限;建立公共數據庫鏈接,你必須擁有CREATE PUBLIC DATABASE LINK權限;固然你還必須擁有遠程數據庫的CREATE SESSION權限;最後就是本地和遠程數據庫都安裝了Oracle Net。網絡

語法函數


SHARED
指定SHARED參數建立的數據庫鏈接能夠在被鏈接源數據庫和目標數據庫的單個網絡中的多個會話共享。在一個共享服務器的配置中,共享的數據庫鏈接能夠防止鏈接遠程數據庫的連接數量變得太大。共享數據庫連接能夠是公共數據庫連接。共享私有連接對多個客戶端鏈接到同一個本地的schema有極大的用處。spa

PUBLIC
經過PUBLIC參數建立的數據庫連接對全部用戶均可見。若是你忽略這個參數,那麼所建立的數據庫連接是私有的,只對當前用戶可用。可否訪問遠程數據庫的數據取決於鏈接遠程數據庫時所使用的認證方式。
*若是你指定的是CONNECT TO user IDENTIFIED BY password,那麼數據庫鏈接時會使用指定的用戶和密碼。
*若是指定的是CONNECT TO CURRENT_USER,那麼數據庫起做用的的用戶取決於所使用連接的做用範圍。
*若是上面兩種方式的參數都忽略了,那麼數據庫使用本地用戶鏈接到遠程數據庫。code

dblink
dblink用於指定完整或不完整的數據庫鏈接名。若是你只指定了數據庫名,那麼Oracle數據庫會隱式的追加本地數據庫的域名。dblink只接受ASCII字符串,而且不支持多個字符串。數據庫連接名不區分大小寫,而且只以大寫的ASCII字符存儲。若是你在數據庫名中使用了引號,那麼引號將會被忽略。
若是GLOBAL_NAMES初始化參數被設置成TRUE,那麼數據庫鏈接必須使用與它所鏈接的庫的名字;反之,若是是false,而你又改變了數據庫的全局名,那麼你可使用這個改變後的全局名。
在一個會話或一個RAC實例配置中能夠建立的數據庫連接的最大個數,取決於OPEN_LINKSOPEN_LINKS_PER_INSTANCE初始化參數的值。對象

建立數據庫連接的侷限
你不能爲別的用戶的schema建立數據庫連接,也不能夠一個schema的名字做爲dblink的名字。點號容許出如今數據庫連接中,所以Oracle數據庫會對整個名字進行轉換,例如ralph.linktosales(ralph是schema名,linktosales是連接名)。blog

CONNECT TO參數
CONNECT TO參數用於指定鏈接遠程數據庫的用戶和憑證。rem

CURRENT_USER參數
CURRENT_USER參數用於建立一個當前用戶數據庫連接。CURRENT_USER必須是遠程數據庫中的合法全局用戶。
若是數據庫鏈接是直接被使用的,而不是從一個存儲的對象實體中引用的,那麼CURRENT_USER與連接的用戶相同。
當執行一個存儲的對象實體(存儲過程、試圖、觸發器)來初始化一個數據庫連接時,CURRENT_USER的名字與該存儲對象的擁有者相同,而不是調用該存儲對象的用戶。例如,數據庫連接在存儲過程scott.p中(由scott建立),而後又用戶jane調用該存儲過程,那麼CURRENT_USER是scott。
可是,若是存儲實體是調用者權限的函數、存儲過程或包,那麼調用者的認證ID將會被用做鏈接的遠程用戶。例如,若是有權限限制的數據庫連接包含在存儲過程scott.p中(由scott建立的調用者權限的存儲過程),一個名爲Jane的用戶調用了該存儲過程,那麼CURRENT_USER是jane,存儲過程Jane的權限執行。字符串

user IDENTIFIED BY password
用於指定鏈接遠程數據庫的用戶名和密碼,這個叫用戶數據庫連接。若是你忽略了這個參數,那麼數據庫會使用鏈接到數據庫的用戶的用戶名和密碼。這個叫鏈接用戶數據庫連接。

dblink_authentication
只有當你建立的是共享數據庫連接時才能指定這個參數,也就是說你必須指定SHARED參數才能使用這個參數。這個參數能夠指定用於鏈接到目標哭的用戶名和密碼。用戶名必須是遠程用戶的合法用戶而且密碼是正確的。這個用戶名和密碼只當認證用,除此以外這個用戶名和密碼就沒有別的其餘操做了。

USING 'connect string'
用於指定遠程數據庫的服務名。若是你只給出了數據庫名,那麼Oracle數據庫會隱式地在鏈接字符串中追加數據庫的域名來建立一個完整的服務名。因此,若是遠程數據庫的數據庫域名與當前庫不一樣時,那麼你必須制定一個完整的服務名。

例子
例子假設有兩個數據庫,分別是local和remote。這個例子中將會用Oracle數據庫的域名,也就是所它們的域名將會不一樣。
1.定義一個公共數據庫鏈接
下面定義一個名爲remote的共享的公共數據庫鏈接,並經過服務名remote來引用數據庫。
CREATE PUBLIC DATABASE LINK remote USING 'remote';
local數據庫的用戶hr經過這個數據庫連接來更新remote數據庫的表(假設hr數據庫有相應的權限):

UPDATE employees@remote
SET salary=salary*1.1
WHERE last_name = 'Baer';

2.定義一個固定用戶數據庫連接
下面語句,remote數據庫上的用戶hr在local數據庫的hr的schema定義了一個名爲local固定的數據庫連接。

CREATE DATABASE LINK local CONNECT TO hr IDENTIFIED BY password USING 'local';


當數據庫連接建立後,hr用戶能夠經過如下方式查詢local數據庫hr schema中的表:
SELECT * FROM employees@local;
hr用戶也能夠經過DML語句修改local數據庫中的數據:

INSERT INTO employees@local (employee_id, last_name, email, hire_date, job_id) VALUES (999, 'Claus', 'sclaus@example.com', SYSDATE, 'SH_CLERK'); UPDATE jobs@local SET min_salary = 3000
WHERE job_id = 'SH_CLERK'; DELETE FROM employees@local
WHERE employee_id = 999;


經過這個固定數據庫連接,remote數據庫上的hr用戶也能夠訪問同一個庫中其餘用戶的表。這些語句假設hr用戶有oe.customers表的read和select權限。這些語句連接到local數據庫的hr用戶並執行對oe.customers表的查詢:

SELECT * FROM oe.customers@local;

3.定義一個CURRENT_USER的數據庫連接
下面語句定義了一個到remote數據庫的current-user數據庫連接,並拿完整的服務名看成連接的名字。

CREATE DATABASE LINK remote.us.example.com CONNECT TO CURRENT_USER USING 'remote';


能執行上述語句的用戶必須是一個在LDAP目錄服務中註冊的全局用戶。
你能夠建立一個同義詞來將remote數據庫上的表隱藏起來。

CREATE SYNONYM emp_table FOR oe.employees@remote.us.example.com;
相關文章
相關標籤/搜索