首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

向大家请问个有关问题!献上200分

2012-02-01 
向大家请教个问题!献上200分SQL codeINSERT INTO openrowset(sqloledb,域名saPWD,SELECT Numbe

向大家请教个问题!献上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,帮忙顶一下
[解决办法]

探讨

SQL code


--找了两台sql20000电脑(同局域网),下面测试可以成功。难道非要我把Sql2008换成2000不成?
INSERT INTO employee(gh,NAME)
SELECT 'L10598','SAD'

CREATE TRIGGER test ON employee
AFTER INSERT
AS
BEGIN
SET XACT_ABORT ON
INS……

[解决办法]
[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
[解决办法]
探讨
在同一局域网内,两台sql2000电脑是绝对可以执行的。
我在外网装有sql2008电脑中,输入你的代码。。。

[解决办法]
mark
[解决办法]
帮顶,碰到过,没解决
[解决办法]
强势围观
[解决办法]
guanmo zhong
[解决办法]
触发器平时不怎么用,来顶贴!
[解决办法]
。。。搞不懂
[解决办法]
我们对于这种需求是用专门的服务器+软件实现的,因为不确定的因素太多了,单靠数据库本身的功能实现异地同步无论是难度还是风险都很大,后期维护的成本也比较高,LZ不妨试试加一台服务器写个应用程序或者服务专门做发布处理吧。
[解决办法]
最好不用触发器

热点排行
Bad Request.