Oracle dblink
11gR2 官方文檔參考
CREATE DATABASE LINK
- 使用 CREATE DATABASE LINK 語句來創建數據庫鏈接。數據庫鏈接是在一個數據庫中,使您能夠訪問其它數據庫對象的模式對象
在創建數據庫鏈接之後,可以通過在表,視圖 或 PL / SQL 對象名稱後加上
@dblink
,來訪問其他數據庫中的表、視圖 或 PL / SQL對象;可以使用 SELECT 語句查詢其他數據庫中的表或視圖,也可以使用 INSERT,UPDATE,DELETE 或 LOCK TABLE 語句操作遠程表和視圖先決條件
- 要創建私有 dblink,必須具有 CREATE DATABASE LINK 系統權限
- 要創建公共 dblink,必須具有 CREATE PUBLIC DATABASE LINK 系統權限
- 另外,必須擁有遠程 Oracle 數據庫的 CREATE SESSION 系統權限
Oracle Net 必須安裝在本地和遠程 Oracle 數據庫上
語法
PUBLIC
- 指定 PUBLIC 創建公共數據庫鏈接,所有用戶可用;如果省略,那麽數據庫鏈接是私有的,只對創建者可用
- 遠程數據庫上可訪問的數據取決於連接到遠程數據庫時 dblink 使用的身份:
- 如果指定
CONNECT TO user IDENTIFIED BY password
,則 dblink 使用指定的用戶和密碼連接 - 如果指定
CONNECT TO CURRENT_USER
如果省略這兩個子句,則 dblink 將以本地連接的用戶連接到遠程數據庫
SHARED
- 指定 SHARED 創建數據庫鏈接,該鏈接使用從源庫到目標庫的單個網絡連接來共享多個會話。在共享服務器配置中,共享數據庫鏈接可以使連接到遠程數據庫的連接數量不會變得太大。共享鏈接通常也是公共數據庫鏈接。但是,當多個客戶端訪問同一個本地 schema 時,共享私有數據庫鏈接可能會很有用,因此使用同一個私有數據庫鏈接
在共享數據庫鏈接中,源庫的多個會話共享目標庫上的同一個連接。一旦在目標庫上建立了一個會話,該會話將從連接中解除關聯,從而使該連接可用於源庫上的另一個會話。為防止未經授權的會話試圖通過 dblink 進行連接,在指定 SHARED 時還必須為授權使用數據庫鏈接的用戶指定
dblink_authentication
dblink
- 指定數據庫鏈接的完整名稱或部分名稱。如果僅指定數據庫名稱,則 Oracle 數據庫隱式附加本地數據庫的數據庫域
- 僅支持 ASCII 字符的 dblink,不支持多字節字符
- 數據庫鏈接名稱不區分大小寫,並以大寫的 ASCII 字符存儲;如果將數據庫名稱指定為帶引號的標識符,則引號將被忽略
- 如果 GLOBAL_NAMES 初始化參數的值是TRUE,則 dblink 必須與它所連接的數據庫具有相同的名稱
- 在一個會話或 Oracle RAC 的一個實例中可以打開的最大 dblink 數取決於初始化參數OPEN_LINKS 和 OPEN_LINKS_PER_INSTANCE 的值
- 創建 dblink 的限制
- 不能在其他用戶的 schema 中創建數據庫鏈接,也不能使用 schema 的名稱來限定 dblink
dblink 的名字中可以使用句點
.
,所以 Oracle 數據庫將整個字符串(比如ralph.linktosales
)解釋為數據庫鏈接的名字,而不是 ralph 用戶有一個數據庫鏈接 linktosalesCONNECT TO 子句
CONNECT TO 子句允許您指定要用於連接到遠程數據庫的用戶和憑證(如果有)
CURRENT_USER子句
- 指定 CURRENT_USER 創建當前用戶數據庫鏈接(current user database link),當前用戶必須是在遠程數據庫上具有有效帳戶的全局用戶
- 如果直接使用 dblink 而不是從存儲對象中使用,則 CURRENT_USER 就是所連接的用戶
- 執行使用 dblink 的存儲對象(如過程,視圖或觸發器)時,CURRENT_USER 是擁有該存儲對象的用戶,而不是調用該對象的用戶。例如,如果 dblink 出現在過程 scott.p(由scott 創建),並且用戶 jane 調用過程 scott.p,則 CURRENT_USER 是 scott
但是,如果存儲對象是調用者權限的函數,過程或包,則調用者的授權 ID 被用作遠程用戶的連接。例如,如果 dblink 出現在過程 scott.p(scott 創建的一個調用者權限過程),並且用戶 Jane 調用過程 scott.p,然後 CURRENT_USER 是 jane,使用 Jane 的權限執行存儲過程
user IDENTIFIED BY passwd
使用固定用戶數據庫鏈接(fixed user database link)指定用於連接到遠程數據庫的用戶名和密碼。如果省略此子句,則 dblink 將使用連接到數據庫的用戶的用戶名和密碼,這稱為連接用戶數據庫鏈接(connected user database link)
dblink_authentication
- 只有在創建共享數據庫鏈接時(也就是說,指定了 SHARED 子句),才能指定此子句
指定目標實例上的用戶名和密碼。此子句將用戶認證遠到程服務器上,並且是安全所需的。指定的用戶名和密碼必須是遠程實例上的有效用戶名和密碼。用戶名和密碼僅用於身份驗證,不為該用戶執行其他操作
定義一個固定用戶 dblink
remote 數據庫中的 hr 用戶定義了一個名為 local 的固定用戶數據庫鏈接,使用 local 數據庫的 hr 用戶連接
CREATE DATABASE LINK local CONNECT TO hr IDENTIFIED BY password USING ‘local‘;
在創建這個數據庫鏈接之後,hr 可以查詢 local 數據庫中 hr 的表:
SELECT * FROM employees @ local;
用戶 hr 還可以使用 DML 語句來修改 local 數據庫上 hr 用戶的表數據:
INSERT INTO employees@local (employee_id, last_name, email, hire_date, job_id) VALUES (999, ‘Claus‘, ‘[email protected]‘, 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 用戶還可以訪問 local 數據庫上其他用戶的表。這條語句假定 hr 用戶擁有 oe.customers 的 SELECT權限。該語句連接到 local 數據庫的 hr 用戶,然後查詢 oe.customers 表:
SELECT * FROM oe.customers@local;
ALTER DATABASE LINK
- 當連接或認證用戶的密碼更改時,使用 ALTER DATABASE LINK 語句修改固定用戶數據庫鏈接
- 不能使用此語句來更改 dblink 的連接用戶或認證用戶;要更改 user,必須重新創建數據庫鏈接
該語句僅適用於固定用戶數據庫鏈接,不適用於連接用戶或當前用戶數據庫鏈接
先決條件
- 要更改私有數據庫鏈接,必須具有 ALTER DATABASE LINK 系統權限
要更改公共數據庫鏈接,必須具有 ALTER PUBLIC DATABASE LINK 系統權限
語法
示例
ALTER DATABASE LINK private_link CONNECT TO hr IDENTIFIED BY hr_new_password; ALTER PUBLIC DATABASE LINK public_link CONNECT TO scott IDENTIFIED BY scott_new_password; ALTER SHARED PUBLIC DATABASE LINK shared_pub_link CONNECT TO scott IDENTIFIED BY scott_new_password AUTHENTICATED BY hr IDENTIFIED BY hr_new_password;
DROP DATABASE LINK
使用 DROP DATABASE LINK 語句從數據庫中刪除數據庫鏈接
先決條件
- 私有數據庫鏈接必須位於自己的 schema 中,只有 owner 才可以刪除
刪除公共數據庫鏈接,必須具有 DROP PUBLIC DATABASE LINK 系統權限
語法
- PUBLIC 指定要刪除公共數據庫鏈接
dblink 指定要刪除的數據庫鏈接的名稱
DROP [ PUBLIC ] DATABASE LINK dblink ;
刪除 dblink 的限制
- 不能刪除在另一個用戶的 schema 中的數據庫鏈接, 不能使用 schema 的名字來限定dblink ,因為 dblink 的名字中允許使用句點。因此 Oracle 數據庫將整個字符串(如
ralph.linktosales
)解釋為數據庫鏈接的名字,,而不是 ralph 用戶有一個數據庫鏈接 linktosales 刪除公共數據庫鏈接 remote
DROP PUBLIC DATABASE LINK remote;
查詢 db_link 的信息
查詢數據庫中所有的 DBLINK
set linesize 200 COL OWNER FOR A15 COL DB_LINK FOR A25 COL HOST FOR A25 COL USERNAME FOR A15 SELECT * FROM DBA_DB_LINKS;
ORA-02082
原因:db link 的名字與數據庫的名字相同
[oracle@hbdw2:/oratmp2]$ oerr ora 2082 02082, 00000, "a loopback database link must have a connection qualifier" // *Cause: An attempt was made to create a database link with the same name // as the current database. // *Action: a loopback database link needs a trailing qualifier, for example // MYDB.EXAMPLE.COM@INST1 - the ‘@INST1‘ is the qualifier
Oracle dblink