背景需求:
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名稱。
下面,利用同樣的方式,進行插入,修改,刪除操作。