2016-11-21 430 views
2

我創建了一個檢查列的積極性的約束,我無法刪除約束,或者確切地說,我甚至不清楚約束存在。試圖刪除約束給出錯誤信息:無法刪除約束 - SQL Server 2008 R2

ALTER TABLE dbo.Test 
DROP CONSTRAINT chk_positive; 

消息3728,級別16,狀態1,行 'chk_positive' 不是一個約束。 消息3727,級別16,狀態0,行1 無法刪除約束。見前面的錯誤

但後來實驗和嘗試重新添加約束表明它已經存在

ALTER TABLE dbo.Test 
ADD CONSTRAINT chk_positive CHECK (n_example > 0); 

消息547,級別16,狀態0,第1行 ALTER TABLE語句衝突與CHECK約束「chk_positive」。衝突發生在數據庫「...」,表「dbo.Test」,列'n_example'中。

查看SELECT * FROM sys.check_constraints的結果,沒有提及chk_positive約束,但是我創建的其他約束在那裏。

任何想法爲什麼這可能發生?任何幫助讚賞。

回答

2

在SQL Server中,約束名稱的名稱空間是整個模式,而不僅僅是表。

換句話說,兩個表不能有相同的約束名稱。一般來說,當我命名限制時,我會列出表名(在你的情況下,chk_test_positive將是一個更可能的名字)。

您可以使用information_schema.table_constraints來查看約束列表。應該有另一個表上定義的chk_positive

我的建議:在約束名稱中包含表名。

0

嘗試顯示每個約束。我的猜測是一個大寫的問題,請嘗試使用[]

SELECT OBJECT_NAME(object_id) AS ConstraintName, 
     SCHEMA_NAME(schema_id) AS SchemaName, 
     OBJECT_NAME(parent_object_id) AS TableName, 
     type_desc AS ConstraintType 
FROM sys.objects 
WHERE type_desc LIKE ‘%CONSTRAINT’ 
0

請在您工作的數據庫下運行以下查詢。你將得到你已經創建的檢查約束(如果存在)和相應的表名。正如其他人猜測的那樣,你創建的檢查約束可能是錯誤地在其他表上創建的。然後你可以相應地繼續。

select 
     cc.name 
     ,cc.object_id 
     ,SysObj.name "TableName" 
     ,cc.parent_object_id 
FROM sys.check_constraints cc 
INNER JOIN sys.objects SysObj 
      on cc.parent_object_id=SysObj.object_id 
WHERE LOWER(cc.name) LIKE '%positive%'