项目开发中也许会遇到这样的场景:一个系统是vb做的用的是sqlserver数据库,一个是java做的用的是oracle数据库,两个系统之间要实现一些数据的交互。异构数据库(oracle称为透明网关)可以解决这种问题,原理是在数据库A上建立一个链接服务器访问数据库B。本篇主要讲解SQLSERVER2000链接Oracle数据库,操作步骤如下:
1.安装oracle9i客户端或者服务器,oracle企业管理器中创建远程数据库。
host:192.168.1.10
sid:hjn
端口:1521
名称:HJN_192.168.1.10
2.安装sqlserver2000并打上sp4以上的补丁。
查看SQL SERVER 2000是否打过SP4的补丁 其实只要查询版本号就知道。
在查询分析器中输入
select @@version
或者输入 print @@version
如果是安装过SP4的补丁。应该是下面的信息:
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86)
May 3 2005 23:18:38
Copyright (c) 1988-2003 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
安装sqlserver或者sp4补丁时很有可能提示文件挂起提示,解决办法如下:
打开注册表编辑器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
中找到PendingFileRenameOperations项目,并删除它.
3.由于sqlserver的链接服务器对应的是oracle8版本,因此需要修改注册表信息。
[HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC]
AllowonlySecureRpcCalls=0
TurnoffRpcSecurity=1
[HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft\MSDTC\MTxOCI]
"OracleXaLib"="oraclient9.dll"
"OracleSqlLib"="orasql9.dll"
"OracleOciLib"="oci.dll"
4.在sqlserver2000中建立oracle链接服务器。
打开企业管理器,在安全性下找到链接服务器。新建链接服务器。
链接服务器名称为MYORA,提供程序名称为Microsoft OLEB DB Provider for Oracle
产品名称为ORACLE,数据库为刚才新建的远程数据库sid,链接字符串也是hjn。
注意名称必须是ORACLE并且是大写。
安全性选择不使用安全上下文,输入oracle的用户名和密码。
在排序规则兼容打上勾,使用远程排序规则上也打上勾。
5. 解决事务问题
开始——程序——管理工具——组件服务;
组建服务——计算机——我的电脑;
右键属性——msdtc标签——安全性配置
把所有能选的都选上(可能不用都选);
确定;
6. 解决连接中断问题
修改hosts文件 (ip 计算机名)
C:\WINDOWS\system32\drivers\etc
192.168.0.11 test
7.SQL的写法有两种
a)使用T-SQL语法:
SELECT * FROM LNK1..用户名.表名--注意用户名称,表名称要大写。
b)使用PLSQL语法:
select * from openquery(LNK1,'select * from 用户名.表名')
update openquery(linked1, 'select ssn from testlinked where ssn=2') set ssn=ssn + 1
insert openquery(linked1, 'select ssn from testlinked where 1=0') values (1000)
delete openquery(linked1, 'select ssn from testlinked where ssn>100')
第二种访问方式比第一种约快50%;第二种访问方式跟直连ORACLE的速度相当;
第一种访问方式可能会导致一些意外错误,如:该表不存在,或者当前用户没有访问该表的权限。
如果需要访问的column中使用没有精度的数据类型,这两种查询方式都可能会报错,这是ORACLE的BUG,
无法修正,只能通过查询语句的特殊处理规避这一问题:
OLE DB 提供程序 'OraOLEDB.Oracle' 为列提供的元数据不一致。执行时更改了元数据信息。
问题与BUG。
1.oracle9i的varchar2长度大于256时就会出现sqlserver2000访问死掉的现象。这个问题我还不知道具体的原因,但是oracle10g是没有问题的。
2.oracle中的clob字段只能通过openquery访问。
3.最好用oracle简单的数据类型。