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 学习资料:

http://czmmiao.iteye.com/blog/2154750

posted @ 2015-01-19 14:28  snow__wolf  阅读(343)  评论(0)    收藏  举报