oracle跨数据库查询?sql怎样跨数据库查询oracle
其实oracle跨数据库查询的问题并不复杂,但是又很多的朋友都不太了解sql怎样跨数据库查询oracle,因此呢,今天小编就来为大家分享oracle跨数据库查询的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
sql怎样跨数据库查询oracle
假定您现在拥有一个以Microsoft.NET为架构的网络订购系统,但是品管维护系统却仍然使用一套旧式的Oracle数据库应用程序。当您的顾客在产品保固期间下了产品更换之类的订单,则该笔订单将不收取任何费用。此时您需要从Oracle数据库得到实时的查询结果。借着建立连结服务器的方式(linkedServer),您将可以从SQLServer实时查询出位于Oracle数据库的顾客资料,找出谁是您既有的客户。
当您的资料分散在不同的SQLServer数据库时,藉由连结服务器可让您执行跨服务器之分布式查询。当所有的数据库服务器都是SQLServer,则连结服务器的设定十分容易,而且在SQLServer线上手册中就涵盖了您所需要了解的所有事项。然而,当部分资料是放在Oracle数据库服务器的时候,这就可能带给您许多挑战。举例来说,光是设定连结服务器就不是一件容易的事。您必须了解到:即是您要在SQLServer的EnterpriseManager设定一个Oracle连结服务器,这台SQLServer对Oracle来说就是一个客户端。所以您必须在SQLServer所在的服务器成功地安装并组态Oracle之客户端软件。因为Oracle提供的产品只支持Oracle8以后的数据库,所以我假设您正在使用的都是Oracle8以后的数据库。在OracleNet8函式库则提供了SQLServer所需要的客户端软件。
设定连接服务器时是利用Microsoft所提供的OLEDB ProviderforOracle,使用的Oracle网络函式库为SQL*Net2.3.3.0.4或是以后的版本,不过这是Oracle7.3数据库所提供的。换句话说,要设定Oracle数据库为SQLServer的连接服务器时,Oracle数据库只要是7.3.3.4以后的版本,并搭配适当的SQL*Net或是Net8函式库即可。
在Oracle数据库中,一个schema即代表着SQLServer专家们所熟知的单一数据库(译者注2)。连接至Oracle数据库时,您必须提供schema名称、密码以及主机联机字符串(hoststring)。每一个特定的Oracle帐户都拥有一个Oracleschema,而且只能有一个schema。所以schema名称其实就等于该schema拥有者的帐户名称。您可以查询Oracle的资料字典(Datadictionary)以得到更多有关schema的内容。
至于Oracle联机字符串又可称为服务名称(servicename)或是系统识别资料(SystenIdentifier,SID)。我们所谓的SQLServer数据库个体(instance)在Oracle则称为数据库(database)。所以安装OracleServer时,安装程序OracleUniversalInstaller(为一个图形接口之安装程序,与SQLServer的Setup程序类似)将会询问您SID名称为何,以作为Oracle数据库之名称。
这个部分原作者所提到schema的解释有点问题。Oracleschema可视为同一个使用者所拥有的所有数据库对象(schemaobjects)之集合。举例来说,使用者scott所建立的EMPtable其完整名称为SCOTT.EMP,而SCOTT就是EMP的schema名称。所以schemaname其实就是一个Oracle数据库之使用者帐号。但是绝对不能拿来跟数据库相提并论!因为SQLServer的数据库架构包含了datafiles与logfiles,但是Oracle的schemaobjects只存在于tablespace中。为了避免部分读者产生混淆,特此说明。
如何跨Oracle数据库实现表级别的实时同步
一.前言
这个问题是上一篇文章《Oracle跨数据库实现定时同步指定表中的数据》中所提问题的进一步延伸。考虑到对数据的实时性要求比较高,设置成定时同步,有点不妥,需要改善升级更改为实时同步。
下面介绍到的方式,严格意义上说,并没有实现实时同步。是通过Oracle数据库创建同义词+DBlink的方式,来建立远程映射。在查看数据时,直接去远程查询源库中的表。
而我一直关注的是如何进行同步数据,却没有考虑到可以建立映射。另外,还有一点就是需要交代,就是同步到目标数据库中的表,不进行增删改操作,只进行查询的操作,这也是可以使用同义词方式解决问题的关键。
这种解决思路的出现,多亏了在CSDN问答时,热心网友的回答,下面就是问题详情描述。
二.问题描述
有两个Oracle数据库,分别布置在不同的服务器上,系统均为windows2003;
这里暂且说成是一个主数据库和从数据库:
(1)主数据库:oracle_A;
(2)从数据库:oracle_B;
在oracle_A中有一个表table_A与oracle_B中的表table_B结构相同;
我是处在oracle_B,oracle_A数据库分配给我有一个访问oracle_A表table_A的用户,该用户只拥有查询的权限;
另外,需要说明的一点,就是在oracle_B处,只需对table_B表进行查询的操作,不进行其他增删改的操作。
场景介绍完了,我的问题的是,如何在oracle_A中表table_A发生变化时,实时更新同步到oracle_B的table_B中?
我原来的处理方式:
通过建立远程连接DBLink+JOB定时任务+存储过程的方式,实现了定时同步更新,但不能做到实时同步。
三.采用同义词+DB_Link的方式结果步骤
之所以能够选择采用同义词的方式,处理这个问题。主要还是源于在问题描述中提到一个点,那就是我们只需要对同步后的表进行查询操作。这点是使用同义词方式的重要要素。
下面详细模拟一下整个实验测试的过程:
(1)首先在Oracle_A端创建一个对table_A只有查询功能的用户
<1>创建用户
sqlplus/nolog
conn/as sysdba;
create user username identified by password;
<2>查看所有的用户列表
用户创建完成后,查看用户是否创建成功
select* from all_users;
<3>授予权限
为了能够保证能够登陆,必须赋予如下权限
--授予username用户创建session的权限,即登陆权限
grant create session to username;
--授予username用户使用表空间的权限
grant unlimited tablespace to username;
--oracle对权限管理比较严谨,普通用户之间也是默认不能互相访问的,需要互相授权.
--如果scott用户要授权给username用户查看自己的test表的权限;
sqlplus scott/tiget@localhost:1521/orcl
--授予username用户查看指定的权限
grant select on test to username;
--撤销权限
基本语法同grant,关键字为revoke;
(2)验证用户是否可以成功登录,并进行访问授权的表
--使用sqlplus登录,并进行查询
sqlplus username/password@localhost:1521/orcl;
select* from scott.test;
注意:查询表时,务必带上用户名,说明是哪个用户下的表。
(3)创建远程连接DB_Link
<1>创建远程连接 db_link
create public database link db32connect to tianzhi_test identified by"tianzhi_test" using'192.168.56.6:1521/ORCL'
<2>测试远程连接是否成功
select* from tianzhi_smart.zh_item_news@db32;
(4)在Oracle_B端创建同义词
<1>使用sqlplus登录自己的用户
sqlplus tianzhi_smart/tianzhi_smart@localhost:1521/orcl
<2>创建同义词
create or replace public synonym TEST1130 for scott.TEST@db32;
<3>查询测试
select* from TEST1130;
可以看到这与在Oracle_A源数据库中查到的table_A表中的数据一样.
注意事项:
当远程查询的数据库中包含BLOB字段时,会报出如下错误.
ORA-22992:无法使用从远程表选择的 LOB定位器
当出现这个错误的时候,那是因为跨库连接查询中的表中存在BLOB类型的字段,所以一定要注意,所有表中存在blob类型字段,
不能用 select* from连接的表
不能将blob类型的字段出现在脚本中。
如果这些blob类型的字段一定要导过来,可以先建立临时表再插入本地表,方法如下.在pl/sql中执行
第一步建临时表
create global temporary table foo( X BLOB)
on commit delete rows;
第二步插入本地表
insert into foo select blobcolumn from remoteTable@dl_remote;
Oracle如何实现跨库查询
实现结果:在一个数据库中某个用户下编写一个存储过程,在存储过程中使用DBLINK连接另一个数据库,从此数据库中的一个用户下取数
实现结果:在一个数据库中某个用户下编写一个存储过程,在存储过程中使用DBLINK连接另一个数据库,从此数据库中的一个用户下取数,然后插入当前的数据库中的一个表中。
二.实现方法步骤:
1.创建存储过程
2.在存储过程中先创建database link
3.创建成功
4.从另一个数据库取出数据插入到当前数据库中
5.任务完成
三.创建DBLINK的方法:
1. create public database link dblink
connect to totalplant identified by totalplant
using'(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL= TCP)(HOST= LOCALHOST)(PORT= 1521))
)
(CONNECT_DATA=
(SERVICE_NAME= prd.gdc)
)
)';
语法解释:create public database link DBLINK名字(自己随便起)
connect to用户名 identified by密码
using'(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL= TCP)(HOST=要连接的数据库所在服务器的IP地址)(PORT= 1521))
)
(CONNECT_DATA=
(SERVICE_NAME=要连接的数据库的在本地的服务名(即要连接的数据库的SID))
)
)';
2.如果创建private的DBLINK
create database link dblink
connect to totalplant identified by totalplant
using'(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL= TCP)(HOST= LOCALHOST)(PORT= 1521))
)
(CONNECT_DATA=
(SERVICE_NAME= prd.gdc)
)
)';
四.连接成功后从所连接的数据库中取数的方法:
1. select* from tbl_ost_notebook@dblink;
说明:只需在表名的后面加上"@DBLINK名字"即可。
五.在当前数据库下查看所有的DBLINK的方法:
1. select* from dba_db_links;
六.删除当前数据库下的一个指定的DBLINK的方法:
1.如果创建的是一个public的DBLINK,,删除时需要用
drop public database link dblink;
2.如果创建的是一个private的DBLINK,删除时需要用
drop database link dblink;
说明:drop public database link DBLINK名字;
七.查看当前数据库的全局数据库名的方法:
1. select* from global_name;
八.查看当前用户具有哪些针对DBLINK的权限的方法:
1. SELECT DISTINCT PRIVILEGE AS"Database Link Privileges"
FROM ROLE_SYS_PRIVS
WHERE PRIVILEGE IN('CREATE SESSION','CREATE DATABASE LINK',
'CREATE PUBLIC DATABASE LINK');
Oracle数据库怎样跨库查询
在ORACLE里A库里建立一个同义词可把B库的X表映射到A库。这样A库就当本库的表(虚拟式)使用。
Oracle的同义词(synonyms)从字面上理解就是别名的意思,和试图的功能类似,就是一种映射关系。本文介绍如何创建同义词语句,删除同义词以及查看同义词语句。
oracle的同义词总结:
从字面上理解就是别名的意思,和试图的功能类似。就是一种映射关系。
1.创建同义词语句:
create public synonym table_name for user.table_name;
其中第一个user_table和第二个user_table可以不一样。
此外如果要创建一个远程的数据库上的某张表的同义词,需要先创建一个Database Link(数据库连接)来扩展访问,然后在使用如下语句创建数据库同义词:create synonym table_name for table_name@DB_Link;
当然,你可能需要在user用户中给当前用户(user2)授权: grant select/delete/update on user2
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!