Sql Server Linked Oracle Server
来源:互联网 发布:矩阵的k次幂等于多少 编辑:程序博客网 时间:2024/04/23 18:45
客户有一个监视系统,日志文件写到Oracle数据库里。但是该日志会被定期清除,希望把所有日志记录都存到Oracle服务器中。
一、创建链接服务器
打开企业管理器,在【安全性】-->【链接服务器】上右键【新建链接服务器】。在【常规】选项卡上,选择数据源提供程序"Oracle Provider For OLE DB"。数据源中填写Oracle服务名。在【安全性】选项卡中填写Oracle的登录名和密码。
sp_addlinkedserver 'ORADB', 'ORACLE', 'OraOLEDB.Oracle', 'ORCL'
exec sp_addlinkedsrvlogin 'ORADB','false',null,'JK_DANGAN','caini'
二、链接测试
在查询分析中执行,SELECT * FROM ORADB..JK_DANGAN.RIGHTS。其中ORADB是我设置的链接服务器名。JK_DANGAN是Oracle用户。【附1】
提示错误信息:
服务器: 消息 7320,级别 16,状态 2,行 1
未能对 OLE DB 提供程序 'OraOLEDB.Oracle' 执行查询。
执行 sp_tables_ex 'ORADB' ,已经能获取链接服务器的所有表名。说明链接没有错误。可为什么还是不能执行呢?GOOGLE一下,终于找到解决方法:
在注册表中找到:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSSQLServer/Providers/OraOLEDB.Oracle
将AllowInProcess的值修改为1。如果没有该项,那么自己创建一个就好了。注销之后再测试就链接可以了。
奇怪的是,使用 SELECT * FROM OPENQUERY(ORADB,'SELECT * FROM JK_DANGAN.RIGHTS')【附2】则不存在修改注册表的问题。在网上看到,说是采用OPENQUERY很稳定,速度也不错。
三、将数据写入Oracle
首先想到的是,在Sql Server的数据源表上创建触发器,这样在Sql Server插入一条,也就在Oracle中插入一条。
写好触发器,然后在源表中插入一条测试数据,发现报:
服务器:消息 7391, 级别 16, 状态 1, 行 2
The operation could not be performed because the OLE DB provider 'OraOLEDB.Oracle' was unable to begin a distributed transaction.
[OLE/DB provider returned message:New transaction cannot enlist in the specified transaction coordinator.]
The operation could not be performed because the OLE DB provider 'OraOLEDB.Oracle' was unable to begin a distributed transaction.
[OLE/DB provider returned message:New transaction cannot enlist in the specified transaction coordinator.]
原因是在Windows Server 2003 上,Microsoft 分布式事务协调器服务必须运行在 NT AUTHORITY/NetworkService 。【附3】
由于客户的SQL Server服务所在服务器是集群的一台服务器,不能修改MSDTC的运行设置。最终选择了在 SQL Server服务上创建任务,定期进行数据读取写入到Oracle。
附1:
在 Oracle 链接服务器中引用表时,请使用以下规则:
- 如果在 Oracle 中创建的表名和列名没有引用的标识符,请全部使用大写字母名称。
- 如果在 Oracle 中创建的表名和列名有引用的标识符,请全部使用与 Oracle 中创建名称时相同的字母大小写格式。
- INSERT 语句应为表中的所有列提供值,即使表中的某些列为 NULL 或有默认值。
附2:
依据 OLE DB 提供程序的能力,还可以将 OPENQUERY 函数引用为 INSERT、UPDATE 或 DELETE 语句的目标表。
也就是说,可以将OPENQUERY当作一个表看待,甚至可以跟别的表联合查询。
INSERT INTO OPENQUERY(ORADB,'SELECT * FROM JK_DANGAN.RIGHTS')
SELECT * FROM RIGHTS
WHERE NOT EXISTS
(SELECT * FROM OPENQUERY(ORADB,'SELECT * FROM JK_DANGAN.RIGHTS') T WHERE T.ID = RIGHTS.ID)
SELECT * FROM RIGHTS
WHERE NOT EXISTS
(SELECT * FROM OPENQUERY(ORADB,'SELECT * FROM JK_DANGAN.RIGHTS') T WHERE T.ID = RIGHTS.ID)
附3:
参看文章:http://support.microsoft.com/kb/903944/zh-cn
- Sql Server Linked Oracle Server
- Sql Server Linked Oracle Server
- Calling an Oracle function from SQL Server Linked Server
- SQL Server链接服务器 Linked Server
- SQL Server Linked Server 链接服务器
- SQL Server链接服务器 Linked Server
- SQL server linked server 权限配置页面
- Microsoft SQL Server - Create Linked Server
- [SQL SERVER] 如何linked server連接Oracle (Oracle Provider for OLE DB)
- [sql server] 通过SQL Linked Server 执行Oracle 存储过程小结
- How to Connect Oracle 9i with SQL Server 2000 for establishing the linked server
- How to Connect Oracle 9i with SQL Server 2000 for establishing the linked server
- sql server link server oracle
- 转载-64位SQL Server 2008的Linked Server连接64位的Oracle--Oracle Provider for OLEDB
- SQL Server --> Oracle (一)
- SQL Server、Oracle纵横谈
- oracle连接SQL SERVER
- oracle 连接 sql server
- Tomcat中文乱码问题的原理和解决方法
- JavaMail api详解
- 五句话足以改变一生
- 人的一生会遇上的四个人
- A will of granite.
- Sql Server Linked Oracle Server
- 我一直想做你心底的公主.可是你不明白我的心
- 我得到了很多,同样我也失去了很多很多,这个世界就是这样的吗?
- Socket
- Winsock 完成端口类分析(一)
- 无主题
- JS 父子窗口操作总结
- 我的log4j配置文件
- C数值算法