oracle 创建dblink
当用户要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据。下面讲介绍如何在本地数据库中创建dblink.
创建dblink一般有两种方式,不过在创建dblink之前用户必须有创建dblink的权限。想知道有关dblink的权限,查看当前用户的权限(test用户):
--查看权限 SELECT * FROM User_Sys_Privs p WHERE p.privilege LIKE UPPER('%link%');
USERNAME PRIVILEGE ADMIN_OPTION
1 TEST CREATE PUBLIC DATABASE LINK NO
2 TEST CREATE DATABASE LINK NO
3 TEST DROP 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 test;
1.创建dblink的第一种方式,是在本地数据库tnsnames.ora文件中配置了要远程访问的数据库。
xxxx = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 1.1.21.17)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = dataprocess) ) )
CREATE PUBLIC DATABASE LINK test_lk CONNECT TO dataprocess IDENTIFIED BY dataprocess USING 'dataprocess';
create public database link <DBLink名称> connect to <被连接库的用户名> identified by <被连接库的密码> using '<Oracle客户端工具建立的指向被连接库服务名>';
创建完成后,写一个查询语句测试;
SELECT * FROM dataprocess.sys_user@test_lk;
查询到结果即表示创建成功。
但是这里遇到了这个问题,

此问题正在找原因,暂时未接到解决。解决以后再记录。
二、创建dblink的第二种方式,是在本地数据库tnsnames.ora文件中没有配置要访问的远程数据库,
CREATE PUBLIC DATABASE LINK test_link CONNECT TO dataprocess IDENTIFIED BY dataprocess USING '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 1.1.21.17)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = dataprocess) ) )';
写测试语句查询,
select * from sys_user@test_link;
结果抛出异常,
ORA-01017: invalid username/password; logon denied
ORA-02063: preceding line from

意思是我的用户名和密码错了,但是我很确定没问题。
创建dblink的数据库版本:

查看远程数据库的版本信息:
sqlplus 用户名/密码@ip地址[:端口]/service_name [as sysdba]
应该是11g密码区分大小写的缘故,需要在11g中重新设置大写的密码。实际上可以不用通过修改密码的方式来解决,只需要加上“”号即可。
尝试在创建dblink时用“”把密码引起来。
CREATE PUBLIC DATABASE LINK test_link CONNECT TO dataprocess IDENTIFIED BY "dataprocess" USING '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 1.1.21.17)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = dataprocess) ) )';
经测试,ok。可正常获取到远程数据库的数据。
参考文章:
http://www.poluoluo.com/jzxy/201011/98780.html
http://www.linuxidc.com/Linux/2013-01/78778p2.htm
http://77857.blog.51cto.com/67857/447824/
http://www.cnblogs.com/quanweiru/archive/2012/07/31/2616149.html
oracle 学习资料:

浙公网安备 33010602011771号