当我们需要跨越本地数据库,访问远程网络上的另外一个数据库表中的数据时,在本地数据库中必须创建远程数据库的dblink。通过dblink,本地数据库就可以像访问本地数据库一样访问远程数据库表中的数据。下面讲介绍如何在本地数据库中创建dblink.
创建dblink一般有两种方式,不过在创建dblink之前,用户必须有创建dblink的权限。想查询有关dblink的权限,以sys用户(SYSDBA)登录到本地数据库,做如下查询:
1 select * from user_sys_privs t where t.privilege like upper('%link%');
查询结果如下:
可以看出在数据库中dblink有三种权限:
1 CREATE DATABASE LINK --所创建的dblink只能是创建者能使用,别的用户使用不了; 2 CREATE PUBLIC DATABASE LINK --public表示所创建的dblink所有用户都可以使用; 3 DROP PUBLIC DATABASE LINK --删除建立的public database link。
用sys用户登录本地数据库,把“CREATE PUBLIC DATABASE LINK”和“DROP PUBLIC DATABASE LINK”权限授予给你的本地数据库用户scott:
grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to scott;
然后以scott用户登录本地数据库
1、本地数据库tnsnames.ora文件中已经配置了要远程访问的数据库的连接。
create public database link TO_JXC connect to scott identified by tiger using 'JXC';
其中TO_JXC是你创建的dblink名字,JXC是远程数据库的实例名(SID),scott/tiger是登录到远程数据库的用户/密码。
注:也可以不用将创建database link的权限赋予给scott,直接用sys用户将database link创建好也可以。
然后在本地数据库中通过dblink访问远程数据库'JXC'中scott.tb_test表,sql语句如下所示:
select * from scott.tb_test@TO_JXC;
第一种方式的tnsnames.ora文件中信息如下:
JXC = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.50)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = JXC) ) )
2、没有在本地数据库tnsnames.ora文件中配置要访问的远程数据库的连接,那么需要在创建database link的时候,附加上远程数据库的连接服务名配置,如下:
create database link to_test connect to scott identified by tiger using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.50)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = JXC) ) )';
这种方式是把第一种配置在tnsnames.ora文件中的信息,直接放在了创建dblink的语句中。