DBLink:主要是针对两台不同的数据库服务器,从一台数据库服务器的一个用户读取另一台数据库服务器下的某个用户的数据,这个时候可以使用dblink。
场景:数据库服务器分别为25和33,其中33为远程服务器,即我当前登录25,需要操作33的数据库。
----创建dblink
create public database link remote
connect to test identified by test
using 'remote33'
connect to test identified by test
using 'remote33'
dblink 的名称为remote
test为登录33的用户名和密码
remote33为在25机器上tnsnames.ora中配置的到33上的网络服务名,如下:
test为登录33的用户名和密码
remote33为在25机器上tnsnames.ora中配置的到33上的网络服务名,如下:
remote33 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.33)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
所以首先要到目标数据库服务器25上配置tnsnames.ora
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.33)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
所以首先要到目标数据库服务器25上配置tnsnames.ora
----还可以使用缺省登录方式创建,即不指定远程数据库的用户名和密码:
create public database link remote
using 'remote33'
using 'remote33'
在不指定用户名和口令的情况下,ORACLE使用当前的用户名和口令登录到远程数据库。假如我们通过pl/sql developer以test用户登录执行上述命令,然后再以 bjaic 用户登录到25上,执行 select * from
table@remote,则会报错:
ORA-00924:表或视图不存在;
ORA-02063:紧接着line(起自remote)
ORA-00924:表或视图不存在;
ORA-02063:紧接着line(起自remote)
此时所要访问的表
table 不在数据库链接中指定的远程帐户bjaic下,但该帐户有访问该表的权限,那么我们在表名前要加上该表的用户名test。即:select * from
test.
table
@remote;
----public & private
public 对所有的数据库用户开放访问权。private 只对建立它的用户授权。公用数据库链接更为有用,因为它使你不必为每一个潜在用户创建单独的链接。即使是public,用户名仍旧固定,所有使用这个 dblink 的用户都作为用户 test 连接到远程数据库。
----如果 ssh 框架开发过程中要用到另一个 oracle 数据库中的表,但是 hibernate 不能直接对 dblink 中的表进行映射导致无法使用 hibernate 创建 pojo 类,解决的办法是在本地数据库创建 dblink 数据库表的 synonymous,再利用 hibernate对此synonymous 进行映射就可以建立映射关系了,需要注意的是创建的 synonymous 不要跟本地表同名这样 hibernate 将会映射本地表了。
本文转自 august 51CTO博客,原文链接:http://blog.51cto.com/august/116958,如需转载请自行联系原作者