CREATE TRIGGER TRI_SOCONFIRM ON dbo.web_so_confirm 
FOR INSERT
AS
--加上这两项.
set  XACT_ABORT on
BEGIN DISTRIBUTED TRANSACTION declare @sonum char(20)
declare @mail_addr  varchar(300)
declare @MailServer  char(20)
declare @SenderAddress  char(100)
declare @Subject  char(100)
declare @confirm varchar(500)
declare @body  varchar(2000)
select @sonum=rtrim(sonum) from inserted
select @MailServer=IP,@SenderAddress=Sender from Web_Mail_Server
select @mail_addr=mail from web_user where loginname='bax' set @confirm=''
if exists(select orderkeygroup from [43.82.76.9].WEBDB.dbo.web_soline_confirm where sonum=@sonum and flag='-1')
begin
select @confirm=@confirm + ' ' + isnull(orderkeygroup,'') from [43.82.76.9].WEBDB.dbo.web_soline_confirm where sonum=@sonum and flag='-1'
end
set @Subject='The' + @sonum + '  has been confirmed! '
set @body='Confirmed the order:  '+ @confirm
exec sp_SMTPMail  @SenderAddress, @mail_addr, @Subject, @body , @MailServer update[43.82.76.9].WEBDB.dbo.web_so_confirm set mailflag=1 where sonum=@sonum and mailflag=0

解决方案 »

  1.   

    同时,启动本地和远程服务器的MSDTC服务
      

  2.   

    那就可以是分布式事务本身的问题,参考下面的
    http://expert.csdn.net/Expert/topic/2835/2835706.xml?temp=.1959955
    回复人: j9988(j9988) 一.A.不用事务,关用SELECT 语句.是否可以分布式查询?   B.LINKSERVER 在做分布式更新事务时不能对本机操作.(就是不能环回分布式事务)   C.DBCC TRACEON (3604, 7300)--用跟踪看更详细错误信息.
      
       D.下载MS提供的DTCPing.exe 分装在两台机上,按README说明来运行它.看出错信息.
    http://download.microsoft.com/download/complus/msdtc/1.7/nt45/en-us/DTCPing.exe二.两台机的MSDTC是否都打开了.三.MSDTC设置是否正确.
    1.打开命令提示,运行"net stop msdtc",然后运行"net start msdtc"。
    2.转至"组件服务管理工具"。
    3.浏览至"启动管理工具"。
    4.选择"组件服务"。
     a.展开"组件服务"树,然后展开"我的电脑"。
     b.右键单击"我的电脑",然后选择"属性"。
     C.在 MSDTC 选项卡中,确保选中了下列选项: 网络 DTC 访问
    网络管理
    网络事务
        XA 事务
     e.另外,"DTC 登录帐户"一定要设置为"NT Authority\NetworkService"。
    5.单击"确定"。这样将会提示您"MS DTC 将会停止并重新启动。
      所有的依赖服务将被停止。请按'是'继续"。单击"是"继续。
    6.单击"确定"关闭"我的电脑"属性窗口。四.
    MSDTC依赖于RPC,RPC使用的端口是135,测试135端口是否打开.是否有防火墙?如果有先关了防火墙.
    telnet IP 135
    如果是关闭的打开它.五.
    有的机由于各种原因),SQLOLEDB不能使用分布式事务,更改为"MSDASQL" 的ODBC方式联接.
    使用RRAS而不是RAS.(控制面版--管理工具--远程服务管理器)
    Check whether you are using Remote Access Server (RAS) to access remote servers. If so, make sure that you have implemented Routing RAS (RRAS). Linked server does not work on RAS because RAS allows only one way communication.
    七.检查你的两台服务器是否在同一个域中.
    如果不在同一个域中,是否建立可信任联接.八.如果是WIN2000,升级到SP4九.升级MDAC到2.6以上,最好是2.8.十.要安装SQL的最新补丁: sp3a
    '全部补丁的位置
    http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=9032f608-160a-4537-a2b6-4cb265b80766'应该安装的补丁sql 2000 sp3
    http://download.microsoft.com/download/d/d/e/dde427eb-0296-4eac-a47c-d11a66b03816/chs_sql2ksp3.exe
      

  3.   

    不能执行update操作
    Server: Msg 7306, Level 16, State 2, Line 38
    Could not open table '"WEBATI"."ati"."web_so_confirm"' from OLE DB provider 'SQLOLEDB'.  The provider could not support a row lookup position. The provider indicates that conflicts occurred with other properties or requirements.
    [OLE/DB provider returned message: Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.]
      

  4.   

    在查询分析器里执行如下语句都出现上述错(变量申明略)
    Open myCur
    Fetch myCur Into @sonum,@wavekey
    While @@Fetch_status=0
        Begin
    set @confirm=''
    if exists(select orderkeygroup from [192.168.5.5].WEBATI.ati.web_soline_confirm where sonum=@sonum and wavekey=@wavekey and flag='-1')
    begin
    select @confirm=@confirm + ' ' + isnull(orderkeygroup,'') from [192.168.5.5].WEBATI.ati.web_soline_confirm where sonum=@sonum and wavekey=@wavekey and flag='-1'
    end set @cancel=''
    if exists(select orderkeygroup from  [192.168.5.5].WEBATI.ati.web_soline_confirm where sonum=@sonum and wavekey=@wavekey and flag='0')
    begin
    select @cancel=@cancel + ' ' + isnull(orderkeygroup,'') from  [192.168.5.5].WEBATI.ati.web_soline_confirm where sonum=@sonum and wavekey=@wavekey and flag='0'
    end set @Subject='The SO  ' + @sonum + '  has been confirmed by BenQ, Please ship! '
    set @body='BenQ has confirmed the order:  '+ @confirm + ' BenQ has cancel the order: ' + @cancel exec sp_SMTPMail  @SenderAddress, @mail_addr, @Subject, @body , @MailServer
    --下面一句update报错Multiple-step OLE DB operation generated 
    update  [192.168.5.5].WEBATI.ati.web_so_confirm set mailflag=1 where sonum=@sonum and wavekey=@wavekey and mailflag=0
    Fetch myCur Into @sonum,@wavekey
        End Close myCur
    Deallocate myCur