0

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

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

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

知道为什么会引发此错误吗?

4

2 回答 2

2

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

如果您看到其他此类错误的出现,我会有点担心整个数据库的状态。(我在这里假设您已经完成了 CHECKDB 命令并且错误仍然存​​在......)

于 2008-10-18T01:16:21.693 回答
0

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

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

有趣的是,DTS 包似乎: -

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

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

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

于 2008-10-20T10:55:42.307 回答