插入时违反 PK 的问题

辣椒

我有一个场景,其中几乎所有表都存在 PK 值问题,如下所示。这个结果是数据库错误或者违反了PK插入。使用 DBCC CheckIdent 时,它会显示下一个值与当前值之间的不一致。任何人都可以有几个表发生不匹配的原因吗?

由于随后会复制此数据库,因此我担心此错误会在整个环境中传播。

我改编了这个脚本来修复它,但真的试图找出问题的根源。

    /** Version 3.0 **/

    if object_id('tempdb..#temp') is not null
     drop table #temp

    ;
    with cte as (
        SELECT
            distinct
            A.TABLE_CATALOG AS CATALOG,
           A.TABLE_SCHEMA AS "SCHEMA",
           A.TABLE_NAME AS "TABLE",
           B.COLUMN_NAME AS "COLUMN",
           IDENT_SEED (A.TABLE_NAME) AS Seed,
           IDENT_INCR (A.TABLE_NAME) AS Increment,
           IDENT_CURRENT (A.TABLE_NAME) AS Curr_Value
           , DBPS.row_count AS NumberOfRows
        FROM INFORMATION_SCHEMA.TABLES A
        inner join INFORMATION_SCHEMA.COLUMNS B on b.TABLE_NAME = a.TABLE_NAME and b.TABLE_SCHEMA = a.TABLE_SCHEMA
        inner join sys.identity_columns IC on OBJECT_NAME (IC.object_id) = a.TABLE_NAME
        inner join sys.dm_db_partition_stats DBPS ON DBPS.object_id =IC.object_id 
        inner join sys.indexes as IDX ON DBPS.index_id =IDX.index_id 
        WHERE A.TABLE_CATALOG = B.TABLE_CATALOG AND 
              A.TABLE_SCHEMA = B.TABLE_SCHEMA AND 
             A.TABLE_NAME = B.TABLE_NAME AND 
             COLUMNPROPERTY (OBJECT_ID (B.TABLE_NAME), B.COLUMN_NAME, 'IsIdentity') = 1 AND 
             OBJECTPROPERTY (OBJECT_ID (A.TABLE_NAME), 'TableHasIdentity') = 1 AND 
             A.TABLE_TYPE = 'BASE TABLE'
    ) 
        select 'DBCC CHECKIDENT ('''+A.[SCHEMA]+'.'+a.[TABLE]+''', reseed)' command
            , ROW_NUMBER() OVER(ORDER BY a.[SCHEMA], a.[TABLE] asc) AS ID
            , A.Curr_Value
            , a.[TABLE]
        into #temp
        from cte A
        ORDER BY A.[SCHEMA], A.[TABLE]

    declare @i int = 1, @count int = (select max(ID) from #temp)
    declare @text varchar(max) = ''

    select @COUNT= count(1) FROM #temp

    WHILE @I <= @COUNT
    BEGIN 
        SET @text = (SELECT command from #temp where ID=@I)
        EXEC (@text + ';')
        print @text

        select Curr_Value OldValue, ident_current([TABLE]) FixValue, [TABLE] from #temp where ID=@I

        SET @I = @I + 1
        SET @text='';
    END
    go


劳尔·迪亚兹

也许具有足够权限的某人或某物因重新播种而犯了错误?

就这么简单:

create table testid (
    id int not null identity (1,1) primary key,
    data varchar (3)
)

insert into testid (data) values ('abc'),('cde')

DBCC CHECKIDENT ('testid', RESEED, 1)

insert into testid (data) values ('bad')

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章