修复种子表
金蝶云社区-Jack
Jack
10人赞赏了该文章 3393次浏览 未经作者许可,禁止转载编辑于2019年04月01日 11:22:59

金蝶云星空中的数据表的主键通常情况下不会使用自增ID,而是有一张与其表名相同仅前缀不同的种子表来负责产生自增ID,例如表t_bas_voucher,其对应的种子表名为z_bas_voucher。当出现类似下图的错误时,说明种子表可能已损坏(种子值被非法修改、重置等),需要手动修复。

具体修复方法如下:
/*第一步,查看报错表的当前种子值*/
DBCC CHECKIDENT('z_bas_voucher', NORESEED)

/*第二步,查看报错表的主键最大值*/
DECLARE @FID bigint
SELECT @FID=ISNULL(MAX(FVOUCHERID),100001)+1 FROM t_bas_voucher
SELECT @FID

/*第三步,更新种子值(更新前对比第一步和第二步获取的值,如果第一步获取的种子值更大,则无需更新)*/
DBCC CHECKIDENT('z_bas_voucher', RESEED, @FID)

种子表修复后,仍然需要去排查种子表损坏原因:
1. 是否有人为操作种子表?
2. 二开获取内码的方式是否正确?(只允许通过系统提供的GetSequenceInt32,GetSequenceInt64,GetSequenceString等方法获取)