我想使用存储过程将表从测试数据库复制到具有相同ID /
Identity的链接服务器,但无法正常工作。.我将其设置为IDENTITY_INSERT
,ON
但它仍然抱怨ID列。
这是我的程序:
CREATE PROCEDURE [dbo].[TEST2PROD_CopyUIDataSServer]
AS Begin
declare @sql nvarchar(max)
-- First truncate target table
set @sql = 'EXEC [LINKEDSERVER].tempdb.sys.sp_sqlexec' + char(39)+ 'TRUNCATE Table [ProductManager].dbo.[UIData]' + char(39)+ ';'
---- SET IDENTITY_INSERT ON
set @sql = @sql + 'EXEC [LINKEDSERVER].tempdb.sys.sp_sqlexec' + char(39)+ 'SET IDENTITY_INSERT [ProductManager].[dbo].[UIData] ON' + char(39)+ ';'
---- INSERT UIDATA records from DB1 into linked server DB2
set @sql = @sql + 'WITH TestData as (SELECT * from ProductManager.dbo.UIData UID)' + NCHAR(13)+ 'INSERT INTO [LINKEDSERVER].[ProductManager].[dbo].[UIData]' + NCHAR(13) + 'select * from TestData;'
print @sql
exec (@sql)
end
但是,当我执行SP时,会出现以下错误:
由于列“ Id”,用于链接服务器....的OLE DB提供程序“ SQLNCLI10”无法插入表“
[LINKEDSERVER]。[ProductManager]。[dbo]。[UIData]”。用户没有写该列的权限。
链接服务器属性RPC和RPC out设置为true。我希望有人可以在这里帮助我吗?
更新: 我决定拆开东西,首先我将数据从本地服务器复制到链接服务器,TEMP_TABLE
而不必处理IDENTITY
问题。
然后,我在链接/远程服务器上编写了一个存储过程,因为我没有使用SELECT *
而是指定列列表。很有可能这也可以从SP中的本地服务器工作,但是我没有时间或兴趣来检查它。
USE [ProductManager]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TEST2PROD_CopyBaseTables]
AS BEGIN
DECLARE @DestTable VARCHAR(50)
DECLARE @DestPath VARCHAR(50)
DECLARE @SrceTable VARCHAR(255)
declare @sql nvarchar(max)
DECLARE @columnList varchar(max)
DECLARE @err int
Begin TRY
declare @comma_delimited_list varchar(4000)
--- FIRST TRY WITH ONE TABLE, EXTENDABLE...
set @comma_delimited_list = 'UIData'
declare @cursor cursor
set @cursor = cursor static for
select * from dbo.Split(@comma_delimited_list,',') a
declare @naam varchar(50)
open @cursor
while 1=1 begin
fetch next from @cursor into @DestTable
if @@fetch_status <> 0 break
--Create tablenames
SET @SrceTable = '[ProductManager].[dbo].TEMP_' + @DestTable
SET @DestPath = '[ProductManager].[dbo].'+ @DestTable
print @srceTable;
print @DestTable;
--Truncate target table
set @sql ='TRUNCATE TABLE '+ @DestPath + ';'
--Insert statement needs column names
set @columnList =''
SELECT @columnList = coalesce(@columnList + '[' + name + '],','') FROM sys.columns Where OBJECT_NAME(OBJECT_ID) = @DestTable
if RIGHT(RTRIM(@columnList),1) = ','
begin
SET @columnList = LEFT(@columnList, LEN(@columnList) - 1)
end
--Transfer data from source table 2 destination
set @sql = @sql + ' SET IDENTITY_INSERT ' + @DestPath + ' ON;' + ' INSERT INTO ' + @DestPath + '(' + @columnList + ') SELECT ' + @columnList + ' FROM ' + @SrceTable
print @sql;
exec (@sql)
end
-- not strictly necessary w/ cursor variables since the will go out of scope like a normal var
close @cursor
deallocate @cursor
End Try
Begin Catch
declare @ErrorMsg nvarchar(MAX);
select @ErrorMsg = ERROR_MESSAGE();
SELECT @err = @@error IF @err <> 0 Return @err
end Catch
END
IDENTITY_INSERT
不适用于链接服务器AFAIK,除非您执行包含SET IDENTITY_INSERT
批处理中的动态SQL或在远程服务器上为您执行此操作的某些代码(例如,Stored Proc)。
该IDENTITY_INSERT
是每个会话(参见MSDN),当您使用远程服务器,这将可能是在从通过执行的语句不同的会话[LINKEDSERVER].tempdb.sys.sp_sqlexec
,这会导致你看到它的发生是要失败的。
问题内容: 这有效,返回结果集: 当我尝试将结果集插入表中时: 无法给出此错误: 问题答案: 由于链接服务器“ svrA”的OLE DB提供程序“ SQLNCLI10”无法开始分布式事务,因此无法执行该操作。 消息很清楚也很明确。您所要做的只是打开系统文档,然后按照配置分布式事务的步骤进行操作:配置MS DTC服务 。
它总是导致带有错误消息的catch块 登录失败:未知的用户名或错误的密码。失败:未知的用户名或错误的密码。 我确信给定的密码是正确的。 如何使用给定的密码验证用户名?
问题内容: 以下是我从GoLang获得的MongoDB连接拨号。但是它返回一个紧急消息“ SASL身份验证步骤服务器返回错误:身份验证失败。 ”。我的用户名,密码,hostAddrs和dbName是正确的。我在这里想念什么? 问题答案: 我遇到类似的错误并添加了参数,并且在我们连接到远程MongoDB时可以正常工作 在您的代码中使用以下类似格式:
我正在使用私有电子邮件SMTP服务器向用户发送密码重置。他们的网站指示使用端口465,并在NodeEmailer中将安全设置为true。我似乎连接良好,但我无法验证。我已经仔细检查了我的用户名和密码,因此我知道问题出在我的NodeEmailer配置上: 有什么想法吗?
问题内容: 我想编写一个脚本来测试所有链接的服务器,并返回唯一已连接的服务器(可以肯定只有一个)。 这是我当前的脚本,但是我被困在这一点上: 但是使用此查询,代码无法在第一次迭代时停止,因为它无法连接到表的第一台服务器。这是错误消息: 链接服务器“ server1”的OLE DB提供程序“ MSDASQL”返回了消息“通信链接失败; -10709连接失败(连接超时已过期)”。消息7303,级别16
连接到服务器时出错:fatal:用户“postgres”的密码身份验证失败 fatal:用户“postgres”的密码身份验证失败