使用DTS复制检查约束时出错

时间:2008-10-16 14:08:17

标签: sql-server dts

我有一个DTS包,它通过“复制SQL Server对象”任务引发错误。任务是将表和数据从一个SQL Server 2000 SP4服务器复制到另一个(相同版本),并给出错误: -

找不到'dbo.MyTableName'的CHECK约束,尽管该表被标记为有一个。

源表定义了一个检查约束,似乎会导致问题。在运行DTS包后,该东西似乎正常工作 - 表,所有约束和数据都是在目标服务器上创建的?但是上面的错误会引发,导致后续步骤无法运行。

知道为什么会出现这个错误吗?

2 个答案:

答案 0 :(得分:2)

这表示sys表中的元数据与实际架构不同步。如果您没有看到任何其他更普遍的损坏的迹象,通过将表复制到另一个表(从oldtable选择* into newtable)来重建表,删除旧表然后重命名新表并替换约束将救命。这类似于2000的企业管理器在插入不在表末尾的列时所做的事情,因此在表的中间插入一个新列然后删除将实现同样的事情,如果你不不想手动编写查询。

如果你看到其他类型的错误,我会对整个数据库的状态感到担心。 (我假设你已经完成了CHECKDB命令并且错误仍然存​​在......)

答案 1 :(得分:0)

当新列(带有检查约束)添加到现有表时,会启动此错误。调查我有: -

  • 将表复制到不同的目标SQL Server并得到相同的错误。
  • 创建了一个具有完全相同结构但名称不同的新表,并且没有错误地复制。
  • 在问题表上删除并重新创建了检查约束,但仍然得到相同的错误。
  • 带有ALL_ERRORMSGS的dbcc checktable('MyTableName')没有错误。
  • 源数据库和目标数据库中的dbcc checkdb没有错误。

有趣的是,DTS包似乎: -

  • 复制表格。
  • 复制数据。
  • 创建约束

因为检查约束创建时间是表创建时间后7分钟,即它在移动数据后创建检查约束。这是有道理的,因为它不必在复制时检查数据,可能会提高性能。

正如Godeke建议的那样,我认为系统表中的某些内容已经损坏,因为具有相同列的新表可以工作。即使DBCC语句没有错误?