Sql-Server

約束錯誤 - ‘無法啟用或禁用約束。查看以前的錯誤’

  • April 18, 2011

但是我沒有得到“以前的錯誤”。它給我的行(通過在 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 約束語句上得到了完全相同的錯誤。

相同的未更改腳本在我們的 TEST 數據庫上執行良好,這是與我們的生產數據庫完美匹配的模式。這讓我相信有一些外部因素使這個腳本在測試中工作而不是在生產中工作。

我能夠發現我們的生產機器和測試機器之間的兩個主要區別:

  • 生產數據庫機器最近安裝了 CommVault 軟體。在同一公司的不同數據庫上,此 CommVault 安裝破壞了其他腳本。(是的,我意識到我可以在這裡提供更多資訊 - 我正在努力獲取它)
  • 生產是 SQL 2005 SP4,而測試是 SQL 2005 SP3(9.0.5 與 9.0.4053)。

任何幫助是極大的讚賞。

這是由執行在某人的開發機器上的應用程序引起的,該機器與我們的生產數據庫有連結伺服器連接。這個應用程序阻止了 alter 語句的執行(不知何故,我沒有問)。

感謝您的關注。

在深入研究其他細節之前,我必須先問這個問題。您是否驗證過 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)

引用自:https://serverfault.com/questions/260692