解决方案: |
(调整过程中涉及到数据记录删除操作时请先与用户协商处理)
问题答复:
修复工作如下:
1、首先使用数据库修复脚本对数据库反复修复检查(修复了4遍),直至再修复时错误提示不变,即只剩下无法修复的错误为止,对该数据最后剩下13个一致性错误无法修复,提示信息“CHECKDB 发现了 0 个分配错误和 13 个一致性错误(在数据库 ‘UFDATA_002_2004‘ 中)”。
使用脚本:数据检查.sql
2、根据提示信息中的具体错误信息,如“服务器: 消息 2601,级别 14,状态 3,行 1。不能在具有唯一索引 ‘RRKey‘ 的对象 ‘RdRecord‘ 中插入重复键的行。数据行(1:65607:15)(由 RID = (1:65607:15) 标识)的索引值为 cWhCode = ‘422‘ and bRdFlag = 1 and cCode = ‘0000005913‘。”,从查询分析器中查看现象:
select * from rdrecord where ccode=‘0000005913‘(有记录)
select * from rdrecord where id=‘308090‘(无记录)
下面尝试修正错误。
3、修复数据表Rdrecord(子表rdrecords无错误):
a、重命名rdrecord为rdrecord2;
b、将原收发记录主表rdrecord2中记录复制到新表rdrecord中
select * into rdrecord from rdrecord2,删除Rdrecord2;
c、尝试创建表间关系及rdrecord的索引、主键等时,创建索引RRKey失败,查询
cwhcode+ccode+brdflag上存在的重复值(非法记录),根据提示‘发生在重要主键401上’,查询仓库401,
select count(ccode),ccode from rdrecord where cwhcode=‘401‘ group by ccode,brdflag having count(ccode)>1,查询结果显示ccode=0000000264,0000000265的记录重复。
select * from rdrecord where cwhcode=‘401‘ and ccode in (‘0000000264‘,‘0000000265‘) and brdflag=0,对每个单据号存在2条记录,删除7月1号的单据(实际中应征询用户意见进行妥当处理)
delete from rdrecords where id in (‘308307‘,‘308309‘)
delete from rdrecord where id in (‘308307‘,‘308309‘)
再次创建索引RRkey时发现在仓库408、410、422、423等等上均存在非法重复值,观察数据记录,发现错误记录均在2004-07-01号。
通过以下sql语句查询所有非法记录:
select id,ccode,cwhcode,brdflag from rdrecord where ccode in (
select ccode from rdrecord group by ccode,brdflag,cwhcode having count(ccode)>1) and ddate=‘2004-07-01‘ order by ccode,cwhcode,
通过以下sql语句删除7月1号的非法记录信息:
delete from rdrecords where id in (select id from rdrecord where ccode in (
select ccode from rdrecord group by ccode,brdflag,cwhcode having count(ccode)>1) and ddate=‘2004-07-01‘)
delete from rdrecord where ccode in (
select ccode from rdrecord group by ccode,brdflag,cwhcode having count(ccode)>1) and ddate=‘2004-07-01‘
4、根据提示信息中的具体错误信息,如“违反了 PRIMARY KEY 约束 ‘aaaaaTransVouch_PK‘。不能在对象 ‘TransVouch‘ 中插入重复键。
服务器: 消息 8951,级别 16,状态 1,行 1
表错误: 表 ‘TransVouch‘(ID 785437872)。索引 ‘aaaaaTransVouch_PK‘(ID 2)中下列行的键缺少或无效:”,数据表TransVouch损坏,尝试修复该数据表。
5、同上步骤3,修复数据表TransVouch:
a、重命名TransVouch为TransVouch2;
b、将原收发记录主表rdrecord2中记录复制到新表rdrecord中
select * into transVouch from Transvouch2,,删除transVouch2;
c、试图创建关系索引时提示“服务器: 消息 1505,级别 16,状态 1,行 1
CREATE UNIQUE INDEX 终止,因为发现了索引 ID 2 的重复键。最重要的主键为 ‘0000000949‘。”,查询select * from transvouch where ctvcode=‘0000000949‘,发现有重复记录,故索引创建失败。删除7月1号的重复记录:
(查询)select * from transvouch where ctvcode=‘0000000949‘
select * from transvouchs where ctvcode=‘0000000949‘
由于子表transvouch与主表transvouch通过ctvcode关联,现主表和子表中各存在2条记录,因无法定位子表中哪条记录属于7月1号单据的表体,暂只删除主表中重复记录(由日期关系判断子表transvouchs中autoid较小的记录应为7月1号的表体内容,建议征询用户意见后再决定删除哪条记录,也可后期在界面上删除表体行记录):
(删除)delete from transvouch where ctvcode=‘0000000949‘ and dtvdate=‘2004-07-01‘
6、执行创建关系、索引、主外键脚本,脚步执行成功。
rdrecordCreate.sql;
TransVouchCreate.sql;(此两个脚本可通过企业管理器来创建)
7、再次用数据库修复检查脚本进行复查,检查结果显示数据库结构/数据正确无误。
CHECKDB 发现了 0 个分配错误和 0 个一致性错误(在数据库 ‘UFDATA_002_2004‘ 中)。
数据检查.sql
8、查看采购入库单列表时显示记录异常(只有表头信息),故怀疑rdrecord中存在部分非法记录,其在子表rdrecords中无对应记录。
(查询:)select id from rdrecord where id not in (select distinct id from rdrecords)
(删除:)delete from rdrecord where id not in (select distinct id from rdrecords)
数据修复工作完成!
进入产品查看问题:
1、修复数据库后整理现存量成功;
2、采购入库单列表查询正常;
3、收发存汇总表可查询;
4、可连续修改采购入库单。
注意:
1、建议用户定期备份数据;
2、不可非法关机、随意插拔USB设备等。 |