适用环境sql
操做系统:windows 2003数据库
数据库:sql server 2000/sql server 2005/sql server 2008windows
使用连接服务器进行远程数据库访问的状况安全
1、 问题现象服务器
在执行分布式事务时,在sql server 2005下收到以下错误:网络
消息 7391,级别 16,状态 2,过程 xxxxx,第 16 行分布式
没法执行该操做,由于连接服务器 "xxxxx" 的 OLE DB 访问接口 "SQLNCLI" 没法启动分布式事务。ide
在sql server 2000下收到以下错误:工具
该操做未能执行,由于 OLE DB 提供程序 'SQLOLEDB' 没法启动分布式事务。oop
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。
在sql server 2008下收到以下错误:
连接服务器"xxxxx"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "该伙伴事务管理器已经禁止了它对远程/网络事务的支持。"。
没法执行该操做,由于连接服务器 "xxxxx" 的 OLE DB 访问接口 "SQLNCLI10" 没法启动分布式事务。
2、 解决方案1. 双方启动MSDTC服务
MSDTC服务提供分布式事务服务,若是要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC(Distributed Transaction Coordinator)服务。
2. 打开双方135端口
MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,若是服务器有防火墙,保证135端口不被防火墙挡住。
使用“telnet IP 135 ”命令测试对方端口是否对外开放。也可用端口扫描软件(好比Advanced Port Scanner)扫描端口以判断端口是否开放。
3. 保证连接服务器中语句没有访问发起事务服务器的操做
在发起事务的服务器执行连接服务器上的查询、视图或存储过程当中含有访问发起事务服务器的操做,这样的操做叫作环回(loopback),是不被支持的,因此要保证在连接服务器中不存在此类操做。
4. 在事务开始前加入set xact_abort ON语句
对于大多数 OLE DB 提供程序(包括 SQL Server),必须将隐式或显示事务中的数据修改语句中的 XACT_ABORT 设置为 ON。惟一不须要该选项的状况是在提供程序支持嵌套事务时。
5. MSDTC设置
打开“管理工具――组件服务”,以此打开“组件服务――计算机”,在“个人电脑”上点击右键。在MSDTC选项卡中,点击“安全配置”按钮。
在安全配置窗口中作以下设置:
l 选中“网络DTC访问”
l 在客户端管理中选中“容许远程客户端”“容许远程管理”
l 在事务管理通信中选“容许入站”“容许出站”“不要求进行验证”
l 保证DTC登录帐户为:NT Authority\NetworkService
6. 连接服务器和名称解析问题
创建连接sql server服务器,一般有两种状况:
l 第一种状况,产品选”sql server”
EXEC sp_addlinkedserver
@server='linkServerName',
@srvproduct = N'SQL Server'
这种状况,@server (linkServerName)就是要连接的sqlserver服务器名或者ip地址。
l 第二种状况,访问接口选“Microsoft OLE DB Provider Sql Server”或“Sql Native Client”
EXEC sp_addlinkedserver
@server=' linkServerName ',
@srvproduct='',
@provider='SQLNCLI',
@datasrc='sqlServerName'
这种状况,@datasrc(sqlServerName)就是要连接的实际sqlserver服务器名或者ip地址。
Sql server数据库引擎是经过上面设置的服务器名或者ip地址访问连接服务器,DTC服务只经过服务器名地址访问连接服务器,因此要保证数据库引擎和DTC都能经过服务器名或者ip地址访问到连接服务器。
数据库引擎和DTC解析服务器的方式不太同样,下面分别叙述
6.1 数据库引擎
第一种状况的@server或者第二种状况的@datasrc设置为ip地址时,数据库引擎会根据ip地址访问连接服务器,这时不须要作名称解析。
第一种状况的@server或者第二种状况的@datasrc设置为sql server服务器名时,须要作名称解析,就是把服务器名解析为ip地址。
有两个办法解析服务器名:
一是在sql server客户端配置中设置一个别名,将上面的服务器名对应到连接服务器的ip地址。
二是在“C:\WINDOWS\system32\drivers\etc\hosts”文件中增长一条记录:
xxx.xxx.xxx.xxx 服务器名
做用一样是把服务器名对应到连接服务器的ip地址。
6.2 DTC
无论哪种状况,只要@server设置的是服务器名而不是ip地址,就须要进行名称解析,办法同上面第二种办法,在hosts文件中增长解析记录,上面的第一种办法对DTC不起做用。
若是@server设置的是ip地址,一样不须要作域名解析工做。
7. 远程服务器上的名称解析
分布式事务的参与服务器是须要相互访问的,发起查询的服务器要根据机器名或ip查找远程服务器的,一样远程服务器也要查找发起服务器,远程服务器经过发起服务器的机器名查找服务器,因此要保证远程服务器可以经过发起服务器的机器名访问到发起服务器。
通常的,两个服务器在同一网段机器名能就行很好的解析,可是也不保证都能很好的解析,因此比较保险的作法是:
在远程服务器的在“C:\WINDOWS\system32\drivers\etc\hosts”文件中增长一条记录:
xxx.xxx.xxx.xxx 发起服务器名
8.检查你的两台服务器是否在同一个域中. 若是不在同一个域中,是否创建可信任联接.