解决方案: |
首先需要用修复工具将可修复错误修复,由于最后SYSINDEXES表有一个错误无法修复,所以进行导表操作,步骤以及注意事项如下:
对于一些数据库损坏,需要倒表的问题,可以参照如下的方案进行:
--注:如果仅仅是将目的数据库的表结构重新由正确的库结构建立,则可跳过步骤1
1.首先新建数据库:
注意:对于文件命名,应取和正常的数据库相同的名字.即:数据文件和事务日志的名字分别为 ufmodel
,ufmodel_log
2.执行倒表工作:
一般来说,会想到使用[导入/导出数据]来进行.但这样做不能将表中的对象导入.而且更为关键的是,数据
表中的自增长字段无法导入.
因此,需要采用游标来实现,具体实现语句如下:
--其中TargetDB和SourceDB分别是目的数据库和源数据库,当目标库中存在源库的非系统表时,应先清除。语句未进行判断及自动清除
declare @DesTablename varchar(50)
declare newCur cursor
for
--选择需要倒的表。一般来讲选择全部非系统表,如有特殊需要,可通过name字段进行条件控制
select name from SourceDB..sysobjects
where xtype='U' and name<>'dtproperties' --此处要注意,在对象类型为"U"的用户表中,有dtproperties这样一个系统表,应将其排除
order by name
for read only
Open newCur
Fetch next from newCur into @DesTablename
while @@Fetch_Status = 0 --标志游标是否已经遍历所有记录 <>0时,结束
begin
print @DesTablename
exec ('select * into TargetDB..' + @DesTablename + ' from SourceDB..' + @DesTablename) --分别是目的数据库和源数据库
Fetch next from newCur into @DesTablename
end
close newCur
DEALLOCATE newCur
这样,将所有的表及数据导入新的数据库中.而且对于自增长字段也能够重建.但是数据库中的视图,存储过程
,表中的索引,约束,关系等不能重建,因此需要使用脚本单独重建.
接下来,根据损坏的数据库的软件版本,比如851A,找到一个完好的851A的数据库,来生成脚本语句.
注意,在使用SQL管理器的[生成SQL脚本]功能时,有一些选项需要做控制,根据具体情况判断需要编写哪些对
象脚本。比如是否Create ,是否 Drop等确实没有一个统一的方案,需要各位在实际应用时,根据各个选项
的意义,具体选择处理。通常来讲,可做如下控制:
[常规]选项卡下,选中[编写全部对象脚本]
[设置格式]选项卡下,去掉所有选项
[选项]选项卡下,选中"表脚本选项"的所有4个选项 |