背景需求:
A库想查B库的东西可以在A库上建一个DBLINK,单向,不需要在B上建,除非B也想查A的东西
然后只要SELECT * FROM TABLE_NAME@DBLINK_NAME就可以了
步骤:
一、鉴权
1、鉴权
首先查询当前用户是否有创建dblink的权限,如果没有,需要赋权:赋权需要在sys下执行:grant create public database link,create database link to 'MyUserName';
select * from user_sys_privs t where t.privilege like upper('%link%');
命令查询,从结果上看到当前用户有创建权限。
在创建database link之前,我们需要判断,登陆的用户是否具备创建database link 的权限,所以我们执行以下的语句(用wangyong用户登陆orcl):
-- 查看wangyong用户是否具备创建database link 权限
select * from user_sys_privs where privilege like upper('%DATABASE LINK%') AND USERNAME='WANGYONG';
如果查询有返回行,则表示具备创建database link权限,否则,则需要使用sys登陆orcl为WANGYONG用户赋予创建权限
-- 给wangyong用户授予创建dblink的权限
grant create public database link to wangyong;
此时,再执行上面查看是否具备权限的sql语句,会发现有返回行,表示,WANGYONG这个用户已经具备创建database link的权限。
二、创建DBLink
2、创建dblink
CREATE DATABASE LINK --所创建的dblink只能是创建者能使用,别的用户使用不了.
CREATE PUBLIC DATABASE LINK --public表示所创建的dblink所有用户都可以使用.
2.1、建DBLINK语句:
CREATE [SHARED] [PUBLIC] database link link_name
[CONNECT TO [user] [current_user] IDENTIFIED BY password]
[AUTHENTICATED BY user IDENTIFIED BY password]
[USING 'connect_string']
3、使用如下sql进行创建:
demo如下:
create database link lcDblink connect to phdev_jzk_20191125 identified by crux using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = mydatabase)))';
create database link 'MyDblinkName' connect to 'UserName' identified by 'PassWord' using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 'RemoteIpORDomainName')(PORT = '1521')))(CONNECT_DATA =(SERVICE_NAME = 'DBSSID')))';
MyDblinkName: 表示自定义dblink名字
UserName:表示 远程数据库的用户
PassWord:表示 远程数据库的密码
RemoteIpORDomainName : 表示远程HOST数据库IP
PORT : 表示远程数据库端口 一般为1521默认端口
DBSSID : 远程数据库的实例名SERVICE_NAME
4、要连接的service_name 读取方式:
远程数据库的SERVICE_NAME可以在远程数据库的sys用户下进行查询
select name,value from v$parameter where name='service_names';
三、使用
使用dblink访问远程的数据库,查询就和本地一样了。
SELECT * from ORG_UNIT@lcDblink WHERE code='149003';
---ORG_UNIT为表名,lcDblink为创建的dblink名称。
下面,利用同样的方式,进行插入,修改,删除操作。