向大家请教个问题!献上200分
- SQL code
INSERT INTO openrowset('sqloledb','域名';'sa';'PWD','SELECT Number,Name,Sex,Birth_Date,Dept_Number,State,type,enable FROM Hz_ware.Dbo.Ware_Person') SELECT A.Person_Number,A.person_name,A.sex,B.BirthDate,B.bumen_bh,'起用','内网','1' FROM inserted A left join employee B on A.person_number=B.gh 把上面这段代码放入一个触发器中,报以下错
服务器: 消息 7391,级别 16,状态 1,行 3
该操作未能执行,因为 OLE DB 提供程序 'sqloledb' 无法启动分布式事务。
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
OLE DB 错误跟踪[OLE/DB Provider 'sqloledb' ITransactionJoin::JoinTransaction returned 0x8004d00a]。
注:在SQL2008数据库中,向外网另一服务器(安装的是sql2000)插入数据。在网上搜了下,把我的电脑(sql2000)和另一电脑(sql2000)正确配置后,测试了下
BEGIN TRAN
SELECT * FROM openrowset('sqloledb','ip';'sa';'pws','SELECT * FROM pubs..employee')
ROLLBACK TRAN
可以正确执行。SQL2008要怎么配置才行?难道也装成SQL2000才行,但SQL2008的数据库转成SQL2000又是麻烦!
能提供解决方案的,另开贴送100分。谢谢。
[解决办法]
莫非大家都有压力,没人回答。
还没用过2008!
[解决办法]
异机触发,本身就不是个很好的选择。
参考如下文章。
SQL Server 2005 创建跨服务器“触发器”
http://topic.csdn.net/u/20100610/17/66fadf93-b284-403b-af27-cae49fdbd840.html?94924
[解决办法]
压力巨大,没用过触发器
[解决办法]
http://support.microsoft.com/kb/816701/zh-cn
[解决办法]
异地链接数据库。
[解决办法]
2008没用过
试下在sql2000 的数据库上面写语句读取2008的然后插入2000可以吗
[解决办法]
我是来膜拜楼主的
[解决办法]
RPC呢?最好用DTCPing工具ping一下测试
[解决办法]
学习了。。
[解决办法]
mark~
[解决办法]
- SQL code
sp_configure 'show advanced options',1reconfiguresp_configure 'Ad Hoc Distributed Queries',1reconfigure with override
[解决办法]
我在2000和2005之间处理大量数据的导入和导出,
链接服务器和openrowset的执行效果是一样的。
两种方法都不支持远程过程调用
触发器中访问远程服务器和类似调用远程过程,所以会出错。
[解决办法]
utility
[解决办法]
路过…
[解决办法]
异地链接数据库。
[解决办法]
good
[解决办法]
对OPENROWSET不熟,帮顶一下吧。感觉LZ数据库的设计有问题,不应该用触发器实现异机同步。一旦出了错就不好调。2008的话试试新功能更改跟踪吧。
[解决办法]
路过,跨服务器~~没有碰过啊
[解决办法]
我最近也在被这个问题困扰着……
------解决方案--------------------
观摩了 学习了。
[解决办法]
在学,sql,楼主的问题很高级耶
[解决办法]
学习了,呵呵
[解决办法]
没弄过,学习一下
[解决办法]
都是高手啊
[解决办法]
高手云集,学习学习
[解决办法]
自己的测试数据库就是2008的,但不知道怎么配置,帮顶了
[解决办法]
关注中。。。
[解决办法]
帮顶。
[解决办法]
没有用过sql2008,帮忙顶一下
[解决办法]
[解决办法]
[size=24px][/size]本人表示压力巨大
[解决办法]
我是来顶贴的
[解决办法]
没弄过,学习下
[解决办法]
[解决办法]
没用过2008,帮顶了
[解决办法]
这个分布式的事务,真是头疼,搞了一上午总是有问题。这个东西看来就得靠运气了
[解决办法]
完全不懂帮顶
[解决办法]
强烈支持楼主的分享
[解决办法]
来学习的
[解决办法]
一下吧,希望主早解
[解决办法]
不懂,怎么弄
[解决办法]
来学系
1
[解决办法]
确实,分布式执行经常会出错,但又不知是什么原因。。
我以前也处理过一次,很头痛。
若能在2000运行,不能在2008中运行。
我似乎是没办法了
[解决办法]
数据库版本问题,高版本可以兼容低版本,低的不能兼容高的,建议全换成08的数据库
[解决办法]
1、按LZ的方式,没有用触发器,将外网环境配置为内网访问。方式如下:
- SQL code
--SQL2000下pubs库测试新建表[employee2]CREATE TABLE [dbo].[employee2] ( [emp_id] [varchar] NOT NULL , [fname] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL , [minit] [char] (1) COLLATE Chinese_PRC_CI_AS NULL , [lname] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL , [job_id] [smallint] NOT NULL , [job_lvl] [tinyint] NULL , [pub_id] [char] (4) COLLATE Chinese_PRC_CI_AS NOT NULL , [hire_date] [datetime] NOT NULL ) ON [PRIMARY]GO--执行事务OKBEGIN TRANSELECT * FROM openrowset('sqloledb','10.0.0.0\cl2k,1444';'sa';'cl2k','SELECT * FROM pubs..employee')ROLLBACK TRAN--执行事务OKinsert into openrowset('sqloledb','10.0.0.0\cl2k,1444';'sa';'cl2k','SELECT * FROM pubs..employee2')select b.* from (select '8' emp_id,'Paolp' fname,'M' minit,'Accorti' lname,13 job_id,35 job_lvl,'0877' pub_id,'1992-08-27 00:00:00.000' hire_date) aright join openrowset('sqloledb','10.0.0.0\cl2k,1444';'sa';'cl2k','SELECT left(emp_id,1) emp_id,fname,minit,lname,job_id,job_lvl,pub_id,hire_date FROM pubs..employee') B on A.fname=B.fname --(43 行受影响)
[解决办法]
4、联机丛书内容:
[解决办法]
因为本机是Windows2008配置MS DTC 分布式事务比较复杂,下文说明在Windows2003中的配置步骤和方式:
请LZ在配置完成后,尝试执行
- SQL code
INSERT INTO employee(gh,NAME)SELECT 'L10598','SAD'
[解决办法]
帮顶,
[解决办法]
在SQL2008中执行语句报错,接下来配置SQL2000和SQL2008所在OS的MSDTC。
INSERT INTO employee(gh,NAME)
SELECT 'L10598','SAD'
--6打开Windows系统,运行输入comexp.msc并回车。配置系统的MSDTC完毕,配置方式按56楼内容。
--下载DTCPing工具检测,结果不通。检查并解决问题的关键步骤如下:
在双方OS中配置网络连接中的WINS选项卡,启用NETBios。因服务器的关系,我通常都关闭它。
注:不过最后检查的时候发现,该选项间接对MSDTC事务有影响。如果默认开启则不管它。
最后说明,双方OS一定要关闭防火墙,否则执行报错,提示没有活动事务。
--7 执行提示成功:
INSERT INTO employee(gh,NAME)
SELECT 'L10598','SAD'
(1 行受影响)
(1 行受影响)
--8 查询执行结果如下:
select * from openrowset('sqloledb','10.0.0.214\cl2k,1444';'sa';'cl2k','SELECT * FROM tempdb.dbo.employee')
--result:
gh NAME
------ ----
L10598 xxx
(1 行受影响)
--总结:
按楼主的方式语句没有问题,是否SET XACT_ABORT ON都不是关键,主要是OS对分布式事务的配置(MSDTC)。
基本要求是双方OS必须启用MSDTC,并按相同模式配置,比如56楼第3图所示,登录账户为networkService,不能启用防火墙,在TCP/ip的WINS选项卡中开启NETbios。
--EOF
[解决办法]
关闭防火墙最好了
把服务设为防火墙的例外好像不大好使……
[解决办法]
高手云集了。
[解决办法]
注1:本机SQL2008配置参数:
- SQL code
select quotename(name) name,value_in_use from sys.configurations where name in ('Ad Hoc Distributed Queries','cross db ownership chaining','remote proc trans')--result:name value_in_use[cross db ownership chaining] 0[remote proc trans] 0[Ad Hoc Distributed Queries] 1
[解决办法]
莫非大家都有压力,没人回答。
还没用过2008!
[解决办法]
大家都很忙啊
[解决办法]
不懂,只能邦顶了~~~~
[解决办法]
hao
[解决办法]
还没用过2008!
[解决办法]
好的,谢谢
[解决办法]
哇,这里真是高手多啊。呵呵
[解决办法]
这帖推荐的目的是什么??
[解决办法]
每天十分啊。
[解决办法]
sql2000没有异常处理的
[解决办法]
学习了。。
[解决办法]
厉害,学习一下
[解决办法]
[解决办法]
没用过触发器
[解决办法]
没用过触发器
------解决方案--------------------
试一试吧,有问题再聊。
[解决办法]
openrowset,这个函数很少用,但是既然楼主用的是2008的,我觉得有另外一种途径可以实现数据的导入导出。右击database,task,import/export.就可以实现了。
[解决办法]
没用过
[解决办法]
好~~很好~~好强大~~
[解决办法]
在两台服务器(安装的winserver2003操作系统)中运行中输入comexp.msc,提示提示找不到这个程序。
在windows2008的运行中输入comexp.msc即打开组件服务对话框,2003好像是无法直接打开(需要设置这里不说)但可以在控制面板-管理工具-组件服务打开。
2:在两台服务器中下载了DTCPing工具,在远程服务器中输入"域名",再点“开始服务”都是一样的提示"DTCping server is ready to take incoming calls",这没连上吧。
这里先不讨论这个工具,因为内外网的使用还涉及其他因素。我之前的测试环境之所以放在内网是撇开内外网的环境因素,如何将外网转为内网可以用VPN实现(这里忽略)。
3:在两台服务器中都设置了"WINS选项卡,启用NETBios。",防火墙也关了。不知要不要重启电脑?但执行还是提示。。。
这里不需要重启机器。执行提示已经改变,应该是SQL2008所在OS配置的问题。
[cross db ownership chaining] 1
[remote proc trans] 1
[Ad Hoc Distributed Queries] 1
和你的结果不一样?不知要怎么设置呀?
- SQL code
sp_configure 'cross db ownership chaining',0reconfigure with overridesp_configure 'remote proc trans',0reconfigure with override
[解决办法]
[解决办法]
mark
[解决办法]
帮顶,碰到过,没解决
[解决办法]
强势围观
[解决办法]
guanmo zhong
[解决办法]
触发器平时不怎么用,来顶贴!
[解决办法]
。。。搞不懂
[解决办法]
我们对于这种需求是用专门的服务器+软件实现的,因为不确定的因素太多了,单靠数据库本身的功能实现异地同步无论是难度还是风险都很大,后期维护的成本也比较高,LZ不妨试试加一台服务器写个应用程序或者服务专门做发布处理吧。
[解决办法]
最好不用触发器