复制后将身份值重置为1

时间:2019-05-15 17:22:16

标签: sql sql-server replication database-replication

我使用SQL Server并创建了一个复制。复制效果很好。但是我已经创建了一个备份订户的数据库来检查值。我用“ IDENT_CURRENT”检查表,并且看到标识列的值为1。这正常吗?我无法在表中插入新内容,因为它会引发“ Violation of PRIMARY KEY”错误。 我该如何解决?

2 个答案:

答案 0 :(得分:0)

您可以使用DBCC CHECKIDENT重新设置身份值。因此,在表中发现标识列的最大值,然后运行以下命令:

例如

USE AdventureWorks2012;  
GO  
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);  
GO  

答案 1 :(得分:0)

我已经编写了自己的解决方案。 此代码将所有表的标识值重置为最大值。 我在数据库复制后使用它。

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

    FETCH NEXT FROM emp_cursor     
        INTO @ColName,@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);'

    )

END     
CLOSE emp_cursor;    
DEALLOCATE emp_cursor;