但是我没有得到“以前的错误”。 它给我的线(通过在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机器之间的两个主要区别:
任何帮助是极大的赞赏。
在挖掘其他细节之前,我必须先问这个问题。 您是否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语句的运行(不知何故,我没有问)。
感谢您的期待。