约束错误 – 无法启用或禁用约束。 查看以前的错误'

但是我没有得到“以前的错误”。 它给我的线(通过在SSMS中双击)显示第二个更改语句是罪魁祸首:

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 constraint语句上得到了相同的确切错误。

相同的未改变的脚本在我们的TEST数据库上工作正常,这是一个与我们的生产数据库完全匹配的模式。 这使我相信有一些外部因素使得这个脚本在testing中工作,而不是在生产中。

我能够发现我们的生产和testing机器之间的两个主要区别:

  • 生产数据库机器最近安装了CommVault软件。 在同一家公司的不同数据库中,CommVault安装打破了其他脚本。 (是的,我知道我可以在这里提供更多的信息 – 我正在努力获得它)
  • 生产是SQL 2005 SP4,而testing是SQL 2005 SP3(9.0.5 vs 9.0.4053)。

任何帮助是极大的赞赏。

在挖掘其他细节之前,我必须先问这个问题。 您是否validation过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) 

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

感谢您的期待。