SQL Server 2008 R2 事务复制“无法为标识列插入显式值...”

sql*_*ess 8 sql-server-2008-r2 transactional-replication

现在我在 SQL Server 2008 R2 中遇到事务复制的“身份危机”。数据库在兼容性 90 中运行。有一个表具有标识列并且不会复制。错误是“当 IDENTITY_INSERT 设置为 OFF 时,无法为表 '' 中的标识列插入显式值。(来源:MSSQLServer,错误号:544)”。

该表的“不用于复制”设置为 true。我也找不到文章的任何设置来指定这一点。

任何想法表示赞赏。

Kin*_*hah 7

只是补充一点,您不必删除并重新创建复制来更改“不用于复制”位。

您可以使用 T-SQL 做到这一点,而无需生成快照或中断复制——

sys.sp_identitycolumnforreplication

1 = 不用于复制

0 = 用于复制,这会导致订阅方身份列出现问题

要为所有表更改它:

EXEC sp_msforeachtable @command1 = '
declare @int int
set @int =object_id("?")
EXEC sys.sp_identitycolumnforreplication @int, 1'
Run Code Online (Sandbox Code Playgroud)

只为1张表改,先找出表的object_id,然后在下面运行

EXEC sys.sp_identitycolumnforreplication table_object_id, 1
Run Code Online (Sandbox Code Playgroud)

编辑

下面的 tsql 会给你一个很好的输出命令,可以在运行整个数据库之前查看:

if exists (select 1 from sys.identity_columns where is_not_for_replication = 0)
begin
SELECT  QUOTENAME(SCHEMA_NAME(t.schema_id)) as SchemaName,  
        QUOTENAME(t.name) AS TableName, 
        c.name AS ColumnName,
        c.object_id as ObjectID,
        c.is_not_for_replication,
        'EXEC sys.sp_identitycolumnforreplication '+cast(c.object_id as varchar(20)) + ', 1 ;' as CommandTORun_SetIdendityNOTForReplication
    FROM    sys.identity_columns AS c 
        INNER JOIN  sys.tables AS t ON t.[object_id] = c.[object_id]
        WHERE   c.is_identity = 1
        and c.is_not_for_replication = 0
end
else 
print 'There are no identity columns that needs NOT FOR REPLICATION set to 1'
Run Code Online (Sandbox Code Playgroud)

对于 Adventureworks 数据库:

在此处输入图片说明


小智 3

使订阅者上的触发器不用于复制,并确保订阅者上的标识列标记为不用于复制。这应该可以解决这个问题。