用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有極大的用處。
PUBLIC
通過PUBLIC參數創建的數據庫鏈接對所有用戶都可見。如果你忽略這個參數,那么所創建的數據庫鏈接是私有的,只對當前用戶可用。能否訪問遠程數據庫的數據取決於連接遠程數據庫時所使用的認證方式。
*如果你指定的是CONNECT TO user IDENTIFIED BY password,那么數據庫連接時會使用指定的用戶和密碼。
*如果指定的是CONNECT TO CURRENT_USER,那么數據庫起作用的的用戶取決於所使用鏈接的作用范圍。
*如果上面兩種方式的參數都忽略了,那么數據庫使用本地用戶連接到遠程數據庫。
dblink
dblink用於指定完整或不完整的數據庫連接名。如果你只指定了數據庫名,那么Oracle數據庫會隱式的追加本地數據庫的域名。dblink只接受ASCII字符串,並且不支持多個字符串。數據庫鏈接名不區分大小寫,並且只以大寫的ASCII字符存儲。如果你在數據庫名中使用了引號,那么引號將會被忽略。
如果GLOBAL_NAMES初始化參數被設置成TRUE,那么數據庫連接必須使用與它所連接的庫的名字;反之,如果是false,而你又改變了數據庫的全局名,那么你可以使用這個改變后的全局名。
在一個會話或一個RAC實例配置中可以創建的數據庫鏈接的最大個數,取決於OPEN_LINKS和OPEN_LINKS_PER_INSTANCE初始化參數的值。
創建數據庫鏈接的局限
你不能為別的用戶的schema創建數據庫鏈接,也不可以一個schema的名字作為dblink的名字。點號允許出現在數據庫鏈接中,因此Oracle數據庫會對整個名字進行轉換,例如ralph.linktosales(ralph是schema名,linktosales是鏈接名)。
CONNECT TO參數
CONNECT TO參數用於指定連接遠程數據庫的用戶和憑證。
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;