2016-11-21 437 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%'