约束错误 - “无法启用或禁用约束。请参阅先前的错误”

约束错误 - “无法启用或禁用约束。请参阅先前的错误”

但是我没有收到“以前的错误”。它给我的一行(通过双击 SSMS)显示第二个 alter 语句是罪魁祸首:

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_A_Audit_AuditTypeID]') 
AND parent_object_id = OBJECT_ID(N'[dbo].[A_Audit]'))
ALTER TABLE [dbo].[A_Audit]  WITH CHECK ADD  CONSTRAINT [FK_A_Audit_AuditTypeID] FOREIGN KEY([AuditTypeID])
REFERENCES [dbo].[T_Type] ([TypeID])
GO
IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_A_Audit_AuditTypeID]') 
AND parent_object_id = OBJECT_ID(N'[dbo].[A_Audit]'))
ALTER TABLE [dbo].[A_Audit] CHECK CONSTRAINT [FK_A_Audit_AuditTypeID] 
GO

现在,当我尝试删除脚本的这一部分时,我在指向同一张表(T_Type)的不同 alter 约束语句上得到了完全相同的错误。

相同的未修改脚本在我们的测试数据库上运行良好,该数据库的架构与我们的生产数据库完美匹配。这使我相信存在一些外部因素导致此脚本在测试中有效但在生产中无效。

我发现我们的生产机器和测试机器之间有两个主要区别:

  • 生产数据库机器最近安装了 CommVault 软件。在同一家公司的另一个数据库上,此 CommVault 安装破坏了其他脚本。(是的,我意识到我可以在这里提供更多信息 - 我正在努力获取它)
  • 生产是 SQL 2005 SP4,而测试是 SQL 2005 SP3(9.0.5 与 9.0.4053)。

任何帮助是极大的赞赏。

答案1

在深入研究其他细节之前,我必须先问这个问题。您是否已验证 dbo.A_Audit 表中没有违反 dbo.T_Type 表上的外键约束的数据?这是否会在生产中显示任何数据?

SELECT * FROM dbo.A_Audit A
WHERE NOT EXISTS ( SELECT * FROM dbo.T_Type T WHERE A.AuditTypeID = T.TypeID)

答案2

这是因为某人的开发机器上运行的应用程序与我们的生产数据库有链接服务器连接。该应用程序阻止了 alter 语句的运行(不知为何,我没问)。

谢谢你的观看。

相关内容