日期:2014-05-16  浏览次数:20586 次

【oracle】dblink创建

目的:oracle中跨数据库查询
????? 两台数据库服务器db_A(本地)和db_B(远程192.168.1.100),db_A下用户user_a 需要访问到db_B下user_b的数据

解决:查询得知使用dblink(即database link? 数据库链)

实现过程:

1、确定用户user_a有没有创建 dblink 的权限:

?

?

????? select?*?from?user_sys_privs?where?privilege?like?upper('%DATABASE?LINK%');????

2、如果没有,以sys用户登录到本地数据库 给用户user_a赋权:

???? grant?CREATE?PUBLIC?DATABASE?LINK,DROP?PUBLIC?DATABASE?LINK?to?user_a;??

注:
dblink有三种权限:
CREATE DATABASE LINK(所创建的dblink只能是创建者能使用,别的用户使用不了)
CREATE PUBLIC DATABASE LINK(public表示所创建的dblink所有用户都可以使用)
DROP PUBLIC DATABASE LINK

3、以用户user_a登录本地数据库,创建dblink

?

  1. create?public??database?link?dblink1????
  2.   connect?to?user_b?identified?by?user_bpass??
  3.   using?'(DESCRIPTION?=(ADDRESS_LIST?=(ADDRESS?=(PROTOCOL?=?TCP)(HOST?=?192.168.1.100)(PORT?=?1521)))(CONNECT_DATA?=(SERVICE_NAME?=?orcl)))';????

注:
当数据库参数global_name=false时,就不要求数据库链接名称跟远端数据库名称一样。
数据库全局名称可以用以下命令查出:

????? SELECT?*?FROM?GLOBAL_NAME;??

修改可以用以下语句来修改参数值:

  1. ALTER?SYSTEM?SET?GLOBAL_NAME=TRUE/FALSE;??

?

4、创建完成,引用

-- 查询、删除和插入数据和操作本地的数据库是一样的,只不过表名需要写成“表名@dblink服务器”而已。 ?
例:

????? select?*?from?user_bTablename@dblink1?;??

?

一般情况下引用数据库链接,可以直接将其放到调用的表名或视图名称后面,中间使用一个 @ 作为分割符:

?

5、删除 DBLink

???? drop??public?database?link?dblink1;????