【发布时间】:2019-10-02 21:52:03
【问题描述】:
我使用 SQL Server 并创建了一个复制。复制效果很好。但我已经创建了一个备份订阅者的数据库来检查值。我检查带有“IDENT_CURRENT”的表,我看到标识列的值为 1。这正常吗?我不能向表中插入新的内容,因为它会引发“违反主键”错误。 我该如何解决这个问题?
【问题讨论】:
标签: sql sql-server replication database-replication
我使用 SQL Server 并创建了一个复制。复制效果很好。但我已经创建了一个备份订阅者的数据库来检查值。我检查带有“IDENT_CURRENT”的表,我看到标识列的值为 1。这正常吗?我不能向表中插入新的内容,因为它会引发“违反主键”错误。 我该如何解决这个问题?
【问题讨论】:
标签: sql sql-server replication database-replication
您可以使用DBCC CHECKIDENT 重新设定身份值。因此,找出表中标识列的最大值,然后运行如下代码:
例如
USE AdventureWorks2012;
GO
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);
GO
【讨论】:
我已经编写了自己的解决方案。 此代码将所有表的标识值重置为最大值。 我在数据库复制后使用它。
DECLARE @TableName AS NVARCHAR(MAX)
DECLARE @ColName AS NVARCHAR(MAX)
DECLARE emp_cursor CURSOR FOR
select COLUMN_NAME, TABLE_NAME
from INFORMATION_SCHEMA.COLUMNS
where COLUMNPROPERTY(object_id(TABLE_SCHEMA+'.'+TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1
order by TABLE_NAME
OPEN emp_cursor
FETCH NEXT FROM emp_cursor
INTO @ColName,@TableName
WHILE @@FETCH_STATUS = 0
BEGIN
--PRINT @ColName
--PRINT @TableName
DECLARE @MaxId AS INT
--PRINT @TableName
EXEC ('DECLARE @MaxId AS INT;
DECLARE @TableName AS NVARCHAR(MAX)='''+@TableName+''';
SELECT @MaxId=ISNULL(MAX(' + @ColName + '),0)+1 FROM '+@TableName+';'+
'DBCC CHECKIDENT ('+@TableName+', RESEED,@MaxId);'+
'PRINT ''Table: ''+ @TableName +'', New Identity Val:''+CAST(@MaxId AS NVARCHAR);PRINT CHAR(13);'
)
从 emp_cursor 获取下一个
INTO @ColName,@TableName
END
CLOSE emp_cursor;
DEALLOCATE emp_cursor;
【讨论】: