oracle dblink使用


一、dblink介紹

dblink是一個單向的數據庫連接,通過設置可以訪問其他數據庫中的數據跟使用本地數據庫中數據一樣的感覺,但注意是單向的dblink。例如:A建連B的dblink,A可以訪問B的表,插入數據到B的表等,但反過來B不可以。

創建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)

  )

  )

二、dblink相關操作

1.查看dblink

select owner,object_name from dba_objects where object_type='DATABASE LINK';

或者

select * from dba_db_links;

2.創建dblink
前提:
    創建dblink的用戶有對應的數據庫權限
        create public database link 或者create database link
        可以使用

grant create public database link,create database link to myAccount;
        來授權.

create public database link dblinkname connect to username identified by password
   using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = database_ip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME =servicename)
)
)';
如果在create之后不加public,則創建的dblink就不是公共的,就只有創建者可以使用了.
補充:如何確定數據庫的servicename:
    1.在sqlplus中使用

show parameter[s] service_names;
  注意parameter和parameters都可以
3.使用db link

    例如,在本機數據庫上創建了一個scott_rmthost的public dblink(使用遠程主機的scott用戶連接),則用sqlplus連接到本機數據庫,執行select * from scott.emp@scott_rmthot即可以將遠程數據庫上的scott用戶下的emp表中的數據獲取到.
也可以在本地建一個同義詞來指向scott.emp@scott_rmthost,這樣取值就方便多了.

4.創建同義詞:

對於經常使用的數據庫鏈接,可以建立一個本地的同義詞,方便使用:

CREATE SYNONYM worker_syn FOR worker@zrhs_link;

5.創建遠程視圖:

CREATE VIEW worker AS SELECT * FROM worker@zrhs_link where…;

現在本視圖可與本地數據庫中的任何其它視圖一樣對待,也可以授權給其它用戶訪問此視圖,但該用戶必須有訪問數據庫鏈接的權限。

其他:

修改GLOBAL_NAME的方法:GLOBAL_NAME=TRUE時,link名必須與遠程數據庫的全局數據庫名global_name)相同;否則,可以任意命名。

show parameter global_name;查詢是否為true(注意是遠程的數據庫,看它是否為true,如果為true,本地建的dblink的名必須和遠程的global_name名一樣),測試過那里果然是false,所以自己起名沒問題。

1.在遠程數據庫的init.ora文件中將global_names設為false

或者

2.sys用戶執行如下語句:ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALSE;

修改后重新啟動數據庫設置才能生效。

數據庫全局名稱可以用以下命令查出:SELECT * FROM GLOBAL_NAME;

5.刪除
    注意:用戶有create public database link 或者create database link 權限.

drop public database link dblinkname;

6.公有dblink使用public修飾關鍵字。在createdrop的時候都需要使用public關鍵字。

公有dblink對所有人開放,在該dblink之上創建的同義詞也會隨之對所有人開放。(測試並確認,不過測試是在一個實例多個用戶之間進行)

私有dblink只有創建者可以訪問,其上的同義詞不能被其他用戶訪問。需為用戶創建視圖,並將視圖授權給所需用戶后,用戶才可訪問該視圖。

另外,不能將帶有dblink的同義詞直接授權給用戶。否則報錯,其等價於:

grant select on table1@user1 to user2                           *

ERROR at line 1:

ORA-02021: DDL operations are not allowed on a remote database

遇到問題:dblink 訪問lob字段會報錯:ORA-22992: 無法使用從遠程表選擇的 LOB 定位器當出現這個錯誤的時候,那是因為你跨庫連接查詢中的這個表存在BLOB類型的字段
所以一定要注意,所有表中存在blob類型字段,
1.不能用 select * from 連接的表
2.不能將blob類型的字段出現在腳本中。。
如果這些blob類型的字段一定要導過來。。
可以先建立臨時表再插入本地表。。
方法如下.在pl/sql中執行
第一步建臨時表
create global temporary table foo
( X BLOB )
on commit delete rows;
第二步 插入本地表
insert into foo select blobcolumn from remoteTable@dl_remote

更詳細解決方法見:http://blog.csdn.net/tianlesoftware/article/details/7676863





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM