于申通地铁项目中,碰到系统集成的问题,数据源分散在各个服务器之中,为了方便本地的数据源获取,我们尝试进行BDLink的建立。从网上查询方法得知以下:
目的: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*fromuser_sys_privswhereprivilegelikeupper('%DATABASE LINK%');
2、如果没有,以sys用户登录到本地数据库 给用户user_a赋权:
grantCREATEPUBLICDATABASELINK,DROPPUBLICDATABASELINKtouser_a;
注:
dblink有三种权限:
CREATE DATABASE LINK(所创建的dblink只能是创建者能使用,别的用户使用不了)
CREATE PUBLIC DATABASE LINK(public表示所创建的dblink所有用户都可以使用)
DROP PUBLIC DATABASE LINK
3、以用户user_a登录本地数据库,创建dblink
create public databaselink dblink1
connect to user_b identified byuser_bpass
using'(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl)))';
*注释:在本次的DBlink创建之中碰到了密码中包含有特殊字符@的密码,经过测试,添加"",将密码包裹之后可以正常建立DBlink。
当数据库参数global_name=false时,就不要求数据库链接名称跟远端数据库名称一样。
数据库全局名称可以用以下命令查出:
SELECT*FROMGLOBAL_NAME;
修改可以用以下语句来修改参数值:
ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALSE;
4、创建完成,引用
-- 查询、删除和插入数据和操作本地的数据库是一样的,只不过表名需要写成“表名@dblink服务器”而已。
例:
select*fromuser_bTablename@dblink1 ;
一般情况下引用数据库链接,可以直接将其放到调用的表名或视图名称后面,中间使用一个 @ 作为分割符:
5、删除 DBLink
droppublicdatabaselink dblink1;
6、创建和删除同义词
对于经常使用的数据库链接,可以建立一个本地的同义词,方便使用
create or replace synonym 同义词名 for 表名;
create or replace synonym 同义词名 for 用户.表名;
create or replace synonym 同义词名 for 表名@数据库链接名;
drop synonym 同义词名;
7、创建和删除视图
create or replace view 视图名 as (select 字段 from 用户.表名@dblink1);
drop view 视图名;
其他:
创建方式二:要求数据库服务器db_A上 tnsnames.ora 中有 数据库db_B的映射(省略)
sql>create database link 数据库链路名 connect to 用户名 identified by 口令 using 'tnsnames.ora配置的主机字符串名';