【问题标题】:Sp to sync two tables using linked servers sql serverSp使用链接服务器同步两个表sql server
【发布时间】:2015-03-02 17:28:37
【问题描述】:

我在 SP 中工作,我在不同的服务器中有两张表,一张是主表,另一张是副本,但列较少,我想要的只是每 5 分钟在主表上运行一次 SP为了验证是否已创建新记录,如果是,则获取这些新记录并将它们插入到位于另一台服务器中的副本表中。

搜索解决方案我发现这个脚本在同一台服务器上运行良好,但是当我尝试使用链接服务器运行它时它失败了......请有人帮我解决这个问题。

这是一个得到的错误......

返回链接服务器“ESDBCGW001T”的 OLE DB 提供程序“SQLNCLI” 消息“合作伙伴事务管理器已禁用对 远程/网络事务。”。消息 7391,级别 16,状态 2,程序 sp_newrecords,第 37 行 操作无法执行,因为 链接服务器“LINKEDSERVER”的 OLE DB 提供程序“SQLNCLI”无法使用 开始分布式事务。

所有配置都是完美的,当我在没有变量的情况下运行插入时运行良好,我的意思是,而不是 @val1@val2@val3 我使用实际值 1'A'、@987654326 @。

USE [XXX]
GO
/****** Object:  StoredProcedure [dbo].[sp_newrecords]    Script Date: 03/02/2015 11:11:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <>
-- Create date: <>
-- Description: <Description,,>
-- =============================================


ALTER PROCEDURE [dbo].[sp_newrecords]


    -- Add the parameters for the stored procedure here

AS
BEGIN

DECLARE @val1 int
DECLARE @val2 nvarchar(50)
DECLARE @val3 nvarchar(50)


    SET NOCOUNT ON;

    -- Insert statements for procedure here
DECLARE mycur1 CURSOR for

 select empid,fname,lname from employee
 where empid = 508 --this is for test only

 OPEN mycur1

 FETCH NEXT FROM mycur1 INTO @val1, @val2 , @val3



 WHILE @@Fetch_Status = 0

 BEGIN



 begin tran /* default read committed isolation level is fine */

    if not exists (select * from openquery (linkedserver,'select * from DBNAME.dbo.Employee_backup'))
     --insert employee_backup values (@val1, @val2 , @val3)
    begin

     INSERT into [linkedserver].[DBNAME].[dbo].[Employee_backup] values (@val1, @val2 , @val3)

    end

 /*if not exists (select * from employee_backup with (updlock, rowlock, holdlock)
                     where employee_backup.empid = @val1 
                        and employee_backup.fname = @val2 )
     --insert employee_backup values (@val1, @val2 , @val3)
     INSERT [LINKEDSERVER].[DBNAME].[dbo].[Employee_backup] values (@val1, @val2 , @val3)*/

 --else
 --  /* update */

 commit /* locks are released here */

 FETCH NEXT FROM mycur1 INTO @val1, @val2 , @val3`enter code here`

 END

 CLOSE mycur1

 DEALLOCATE mycur1

END

【问题讨论】:

    标签: sql-server stored-procedures linked-server


    【解决方案1】:

    您的数据库管理员需要在目标服务器上允许该权限。就个人而言,我会简单地将表从一台服务器复制到另一台服务器,然后存储过程将针对复制的数据运行。

    如果您绝对需要跨服务器,请参考this SO question。

    【讨论】:

      【解决方案2】:

      为什么不直接使用复制来做这样的事情呢?

      可能需要为您的特定问题启用分布式事务协调器 (DTC) https://technet.microsoft.com/en-us/library/cc759136%28v=ws.10%29.aspx

      除了确保启用 DTC 之外,您还应该使用 begin distributed tran 而不是 begin tran

      见:

      https://msdn.microsoft.com/en-us/library/ms188386.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-12
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-09
        • 2020-03-24
        相关资源
        最近更新 更多