1. 程式人生 > >Oracle dblink

Oracle dblink

先決條件 rem 實例 new cte 服務器配置 用戶 code 認證

11gR2 官方文檔參考

  • 使用 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 將根據鏈接的使用範圍與有效的用戶連接
  • 如果省略這兩個子句,則 dblink 將以本地連接的用戶連接到遠程數據庫

    SHARED

  • 指定 SHARED 創建數據庫鏈接,該鏈接使用從源庫到目標庫的單個網絡連接來共享多個會話。在共享服務器配置中,共享數據庫鏈接可以使連接到遠程數據庫的連接數量不會變得太大。共享鏈接通常也是公共數據庫鏈接。但是,當多個客戶端訪問同一個本地 schema 時,共享私有數據庫鏈接可能會很有用,因此使用同一個私有數據庫鏈接
  • 在共享數據庫鏈接中,源庫的多個會話共享目標庫上的同一個連接。一旦在目標庫上建立了一個會話,該會話將從連接中解除關聯,從而使該連接可用於源庫上的另一個會話。為防止未經授權的會話試圖通過 dblink 進行連接,在指定 SHARED 時還必須為授權使用數據庫鏈接的用戶指定 dblink_authentication

    子句

  • 指定數據庫鏈接的完整名稱或部分名稱。如果僅指定數據庫名稱,則 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 用戶有一個數據庫鏈接 linktosales

    CONNECT 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)

  • 只有在創建共享數據庫鏈接時(也就是說,指定了 SHARED 子句),才能指定此子句
  • 指定目標實例上的用戶名和密碼。此子句將用戶認證遠到程服務器上,並且是安全所需的。指定的用戶名和密碼必須是遠程實例上的有效用戶名和密碼。用戶名和密碼僅用於身份驗證,不為該用戶執行其他操作

  • 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 語句修改固定用戶數據庫鏈接
  • 不能使用此語句來更改 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 語句從數據庫中刪除數據庫鏈接

    先決條件

  • 私有數據庫鏈接必須位於自己的 schema 中,只有 owner 才可以刪除
  • 刪除公共數據庫鏈接,必須具有 DROP PUBLIC DATABASE LINK 系統權限

    語法

  • PUBLIC 指定要刪除公共數據庫鏈接
  • dblink 指定要刪除的數據庫鏈接的名稱

    DROP [ PUBLIC ] DATABASE LINK dblink ;
  • 不能刪除在另一個用戶的 schema 中的數據庫鏈接, 不能使用 schema 的名字來限定dblink ,因為 dblink 的名字中允許使用句點。因此 Oracle 數據庫將整個字符串(如ralph.linktosales)解釋為數據庫鏈接的名字,,而不是 ralph 用戶有一個數據庫鏈接 linktosales
  • 刪除公共數據庫鏈接 remote

    DROP PUBLIC DATABASE LINK remote; 
  • 查詢數據庫中所有的 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