当用户要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的dblink。通过dblink,本地数据库可以像访问本地数据库一样访问远程数据库表中的数据。
首先,查看Global_name参数是true还是False。该参数为true时,你在本地建立的DBLINK的名称必须和远程数据库的全局数据库名的Global_name一致才行。
SQL> show parameter global_name;
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
global_names boolean FALSE
global_name可以在远程数据库上得到:
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
ORADB
修改GLOBAL_NAME的方法:
方法一、在数据库的init.ora文件中将global_names设为true/false。
方法二、语句:ALTER SYSTEM SET GLOBAL_NAMES=TRUE/FALSE scope=both;
其次,创建dblink之前用户必须有创建dblink的权限(注意此处赋予的public database link的权限,如果不加上public那么就是创建私有的dblink):
指定PUBLIC创建对所有用户可见的公共数据库链接。如果省略此子句,则数据库链接是私有的,仅对您可用。
SQL> grant create public database link to test;
Grant succeeded.
SQL> grant create database link to test;
Grant succeeded.
直接创建数据库链接时写入配置数据库,客户机上的using中的连接一定要记得重写,只有服务端的链接配置才能在dblink中引用,配置在oracle客户端的tnsnane.ora中的链接配置是不能在dblink中使用的
create database link my_link
connect to hh identified by hh
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.57.129)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oradb)
)
)';
注意:这里要加上服务是共享模式还是专有模式,否则会出现下面错误提示
ERROR at line 1:ORA-12154: TNS:could not resolve the connect identifier specified
这个service_name是您要链接到的数据库服务端的服务名。
其中mylink 是你创建的dblink名字,是数据库连接串的名字。以后就通过这个名字来进行调用远程数据库的内容。
hh/hh是登录到远程数据库的用户/密码。
另外一种情况,所要访问的表不在数据库链接中指定的远程帐户下,但该帐户有访问该表的权限,那么我们在表名前要加上该表的用户名(即本机上面的test可以访问远程数据库里面hh用户下面所有的表,但是hh可以访问hhh下面的hhh_test的表,则可以使用下面语句查询)
SQL> select * from hhh.hhh_test@my_link;
ID
----------
1
对于经常使用的数据库链接,可以建立一个本地的同义词,方便使用:
SQL> create synonym a for test@my_link;
Synonym created.
SQL> select * from a;
ID
----------
2
查看所有的数据库链接,进入系统管理员账号下,运行命令
SQL> select owner,object_name from dba_objects where object_type='DATABASE LINK';
OWNER OBJECT_NAME
-------------------- --------------------
TEST MYLINK
TEST MY_LINK
TEST M_LINK
删除数据库连接
SQL> drop database link mylink;
Database link dropped.
关闭dblink连接,关闭前一定要注意session的回收,在应用程序中使用
SQL> commit;
Commit complete.
SQL> alter session close database link my_link;
Session altered.
任何ddl语句都无法在dblink中直接执行。但通过创建存储过程,使得能在dblink中执行ddl语句。 注意需在目标数据库的相应用户下创建存储过程
总结:DBLINK配置细节很重要,请重点关注下面几点
1.确定被连接数据库可以连通,监听是好的
2.用户角色与权限 配置下面4项(很重要):
create session,create database link,create public database link
3.客户机上的using中的连接一定要记得重写,只有服务端的链接配置才能在dblink中引用,配置在oracle客户端的tnsnane.ora中的链接配置是不能在dblink中使用的