最近公司业务需求中,需要用到跨库查询,在网上找了些教程之后,完美解决。下面我复述下流程。
机器A,ip地址:192.168.0.111,数据库用户名user1,密码user1pass,
机器B,ip地址:192.168.0.222,数据库用户名user2,密码user2pass。
接下来模拟机器A上登录用户user1,创建机器b上用户user2的dblink:
1.机器A上登录用户user1,查看是否有建立dbLink的权限。
SELECT * FROM USER_SYS_PRIVS WHERE PRIVILEGE LIKE UPPER('%DATABASE LINK%');
如果查询结果为空,则说明没有权限,这个时候需要登录机器A的sys用户给user1用户赋权限。
GRANT CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK TO user1;
注:
dblink有三种权限:
CREATE DATABASE LINK(所创建的dblink只能是创建者能使用,别的用户使用不了)
CREATE PUBLIC DATABASE LINK(public表示所创建的dblink所有用户都可以使用)
DROP PUBLIC DATABASE LINK(删除dbLink)
2.重新查询是否有权限
机器A上登录用户user1,执行查询语句
SELECT * FROM USER_SYS_PRIVS WHERE PRIVILEGE LIKE UPPER('%DATABASE LINK%');
这个时候发现查询结果有两条了,那么接下来就可以创建dblink了
3.机器A上登录用户user1,执行查询语句:
CREATE PUBLIC DATABASE LINK user2_dblink
CONNECT TO user2 IDENTIFIED BY user2pass
USING '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.0.222)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl)))';
关键词解释:
user2_dblink:dblink的名称,喜欢写什么就写什么
user2:需要远程连接的数据库用户名
user2pass:需要远程连接的数据库密码
192.168.0.222:远程数据库机器地址
1521:数据库端口
orcl:数据库名称
要是没有创建成功,就是哪个地方写错了
4.使用dblink进行查询
SELECT * FROM T_USER@user2_dblink;
注:
使用dblink的格式是,表名@dblink名称,中间一个@符号做标号就行了,其他与使用普通表是一样的。