2016-11-21 2 views
2

Я создал ограничение, проверяющее положительность столбца, и я не могу отказаться от ограничения, или, точнее, я даже не знаю, существует ли ограничение. Попытка сбросить ограничение выдает сообщение об ошибке:Невозможно отказаться от ограничения - SQL Server 2008 R2

ALTER TABLE dbo.Test 
DROP CONSTRAINT chk_positive; 

Msg 3728, Level 16, State 1, Line 1 'chk_positive' не является сдерживающим фактором. Msg 3727, Уровень 16, Состояние 0, Строка 1 Невозможно отказаться от ограничения. Просмотреть предыдущие ошибки

Но экспериментируют и пытаются повторно добавить ограничение предполагает его уже существует

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

Msg 547, уровень 16, состояние 0, строка 1 Оператор TABLE ALTER противоречили проверочное ограничение "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%'