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

无法找到“dbo.MyTableName”的 CHECK 约束,尽管该表被标记为具有该约束。

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

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

有帮助吗?

解决方案

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

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

其他提示

当向现有表添加新列(带有检查约束)时,会出现此错误。为了调查我有:-

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

有趣的是,DTS 包似乎:-

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top