oracle dblink使用

摘要:
createpublicdatabaselinkto_bylwconnecttoscottidentifiedbytigerusing'bylw';其中to_bylw是你创建的dblink名字,bylw是远程数据库的实例名,scott/tiger是登录到远程数据库的用户/密码。数据库全局名称可以用以下命令查出:SELECT*FROMGLOBAL_NAME;5.删除注意:用户有createpublicdatabaselink或者createdatabaselink权限.droppublicdatabaselinkdblinkname;6.公有dblink使用public修饰关键字。公有dblink对所有人开放,在该dblink之上创建的同义词也会随之对所有人开放。

一、dblink介绍

dblink是一个单向的数据库连接,通过设置可以访问其他数据库中的数据跟使用本地数据库中数据一样的感觉,但注意是单向的dblink。例如:A建连B的dblink,A可以访问B的表,插入数据到B的表等,但反过来B不可以。

创建dblink一般有两种方式,不过在创建dblink之前用户必须有创建dblink的权限。想知道有关dblink的权限,以sys用户登录到本地数据库:

select * from user_sys_privs t

where t.privilege like upper('%link%');

1 SYS CREATE DATABASE LINK NO

2 SYS DROP PUBLIC DATABASE LINK NO

3 SYS CREATE PUBLIC DATABASE LINK NO

可以看出在数据库中dblink有三种权限CREATE DATABASE LINK(所创建的dblink只能是创建者能使用,别的用户使用不了),CREATE PUBLIC DATABASE LINK(public表示所创建的dblink所有用户都可以使用),DROP PUBLIC DATABASE LINK。

在sys用户下,把CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK权限授予给你的用户

grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to scott;

然后以scott用户登录本地数据库

1.创建dblink的第一种方式,是在本地数据库tnsnames.ora文件中配置了要远程访问的数据库。(就是能远程连接那个数据库了)

create public database link

to_bylw connect to scott identified by tiger using 'bylw';

其中to_bylw是你创建的dblink名字,bylw是远程数据库的实例名,scott/tiger是登录到远程数据库的用户/密码。然后在本地数据库中通过dblink访问远程数据库'bylw'中scott.tb_test表,sql语句如下所示

select * from scott.tb_test@to_bylw;

2.创建dblink的第二种方式,是在本地数据库tnsnames.ora文件中没有配置要访问的远程数据库,

create database link to_test

connect to scott identified by tiger

using '(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.5)(PORT = 1521))

)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = bylw)

)

)';

第二种是把第一种配置在tnsnames.ora文件中的信息,直接放在创建dblink语句后面。第一种情况tnsnames.ora文件中信息如下:

bylw =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.5)(PORT = 1521))

)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = bylw)

)

)

二、dblink相关操作

1.查看dblink

select owner,object_name from dba_objects where object_type='DATABASE LINK';

或者

select * from dba_db_links;

2.创建dblink
前提:
创建dblink的用户有对应的数据库权限
create public database link 或者create database link
可以使用

grant create public database link,create database link to myAccount;
 来授权.

create public database link dblinkname connect to username identified by password
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = database_ip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME =servicename)
)
)';
如果在create之后不加public,则创建的dblink就不是公共的,就只有创建者可以使用了.
补充:如何确定数据库的servicename:
1.在sqlplus中使用

show parameter[s] service_names;
注意parameter和parameters都可以
3.使用db link

例如,在本机数据库上创建了一个scott_rmthost的public dblink(使用远程主机的scott用户连接),则用sqlplus连接到本机数据库,执行select * from scott.emp@scott_rmthot即可以将远程数据库上的scott用户下的emp表中的数据获取到.
也可以在本地建一个同义词来指向scott.emp@scott_rmthost,这样取值就方便多了.

4.创建同义词:

对于经常使用的数据库链接,可以建立一个本地的同义词,方便使用:

CREATE SYNONYM worker_syn FOR worker@zrhs_link;

5.创建远程视图:

CREATE VIEW worker AS SELECT * FROM worker@zrhs_link where…;

现在本视图可与本地数据库中的任何其它视图一样对待,也可以授权给其它用户访问此视图,但该用户必须有访问数据库链接的权限。

其他:

修改GLOBAL_NAME的方法:GLOBAL_NAME=TRUE时,link名必须与远程数据库的全局数据库名global_name)相同;否则,可以任意命名。

show parameter global_name;查询是否为true(注意是远程的数据库,看它是否为true,如果为true,本地建的dblink的名必须和远程的global_name名一样),测试过那里果然是false,所以自己起名没问题。

1.在远程数据库的init.ora文件中将global_names设为false

或者

2.sys用户执行如下语句:ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALSE;

修改后重新启动数据库设置才能生效。

数据库全局名称可以用以下命令查出:SELECT * FROM GLOBAL_NAME;

5.删除
注意:用户有create public database link 或者create database link 权限.

drop public database link dblinkname;

6.公有dblink使用public修饰关键字。在createdrop的时候都需要使用public关键字。

公有dblink对所有人开放,在该dblink之上创建的同义词也会随之对所有人开放。(测试并确认,不过测试是在一个实例多个用户之间进行)

私有dblink只有创建者可以访问,其上的同义词不能被其他用户访问。需为用户创建视图,并将视图授权给所需用户后,用户才可访问该视图。

另外,不能将带有dblink的同义词直接授权给用户。否则报错,其等价于:

grant select on table1@user1 to user2 *

ERROR at line 1:

ORA-02021: DDL operations are not allowed on a remote database

遇到问题:dblink 访问lob字段会报错:ORA-22992:无法使用从远程表选择的LOB定位器当出现这个错误的时候,那是因为你跨库连接查询中的这个表存在BLOB类型的字段
所以一定要注意,所有表中存在blob类型字段,
1.不能用 select * from 连接的表
2.不能将blob类型的字段出现在脚本中。。
如果这些blob类型的字段一定要导过来。。
可以先建立临时表再插入本地表。。
方法如下.在pl/sql中执行
第一步建临时表
create global temporary table foo
( X BLOB )
on commit delete rows;
第二步 插入本地表
insert into foo select blobcolumn from remoteTable@dl_remote
更详细解决方法见:http://blog.csdn.net/tianlesoftware/article/details/7676863

免责声明:文章转载自《oracle dblink使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【Azure 环境】在Windows环境中抓取网络包(netsh trace)后,如何转换为Wireshark格式以便进行分析函数中参数传递的5种方式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

php+mysql缓存技术的实现

本教程适合于那些对缓存SQL查询以减少数据库连接与执行的负载、提高脚本性能感兴趣的PHP程序员。概述许多站点使用数据库作为站点数据存储的容器。数据库包含了产器信息、目录结构、文章或者留言本,有些数据很可能是完全静态的,这些将会从一个缓存系统中得到的极大好处。这样一个系统通过把SQL查询的结果缓存到系统的一个文件中存储,从而阻止连接数据库,构造查询与取得返回...

Hibernate一级缓存、二级缓存

缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中,准确说就是一个数据结构中,这个数据结构通常是或类似HashMap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。 1、缓存的伪代码: DAO { HashMap map = new Ma...

access数据库删除两个日期之间 的数据 SQL语句

sql2005中sql语句为 DELETE FROM table WHERE ([date] BETWEEN '2011 - 9 - 19 0 : 00 : 00 ' AND '2011 - 9 - 20 0 : 00 : 00') 词语法是正确的,发现再access中没有影响相关行数,解决方法在日期前后加上#,语法为: delete from table...

redis 模糊搜索

参考:https://blog.csdn.net/dc_726/article/details/42784317 创建一条测试 数据 查询 (默认是 DB 0 ) 创建: set name xiaoming 查询: get name 1、模糊搜索查询 (redis 默认有16个DB , 0-15 ) Redis 模糊搜索 1、keys *   匹配数据库...

MySQL查询大小写是否敏感问题分析

mysql数据库在做查询时候,有时候是英文字母大小写敏感的,有时候又不是的,主要是由mysql的字符校验规则的设置决定的,通常默认是不支持的大小写字母敏感的。  1. 什么是字符集和校验规则? 字符集是一套符号和编码。校对规则是在字符集内用于比较字符的一套规则。任何一个给定的字符集至少有一个校对规则,它可能有几个校对规则。要想列出一个字符集的校对规则,使用...

C++连接mysql数据库的两种方法

现在正做一个接口,通过不同的连接字符串操作不同的数据库。要用到mysql数据库,以前没用过这个数据库,用access和sql server比较多。通过网上的一些资料和自己的摸索,大致清楚了C++连接mysql的方法。可以通过2种方法实现。 第一种方法是利用ADO连接, 第二种方法是利用mysql自己的api函数进行连接。 第一种方法可以实现我当前的需求,通...