2016-11-21 151 views
2

列の陽性を確認する制約を作成しましたが、制約を破棄できません。 は 'chk_positive' 制約ではありません制約を削除できません - SQL Server 2008 R2

ALTER TABLE dbo.Test 
DROP CONSTRAINT chk_positive; 

メッセージ3728、レベル16、状態1、行1:制約を削除しようとすると、エラーメッセージが表示されます。 メッセージ3727、レベル16、状態0、行1 制約を削除できませんでした。以前のエラー、その後

しかし、実験と示唆して制約を再度追加しようとしているを参照してくださいその既に存在する

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

メッセージ547、レベル16、状態0、行1 CHECK制約と競合ALTER TABLEステートメント"chk_positive"競合はデータベース "..."、テーブル "dbo.Test"、列 'n_example'で発生しました。

SELECT * FROM sys.check_constraintsの結果を見ると、chk_positiveという制約はありませんが、私が作成した他の制約もあります。

これはなぜ起こっているのでしょうか?どんな助けもありがたい。

答えて

2

を使用してみてください、活用問題であり、制約名の名前空間は、スキーマ全体だけでなく、テーブルです。

つまり、2つのテーブルに同じ制約名を付けることはできません。一般的に、私が制約に名前を付けるとき、私はテーブル名を(あなたのケースでは、より可能性の高い名前になるだろうchk_test_positive)含まれています。

information_schema.table_constraintsを使用すると、制約のリストを表示できます。別のテーブルに定義されているchk_positiveがあるはずです。

私の助言:制約名にテーブル名を含めてください。

0

すべての拘束を試してみてください。私の推測では、SQL Serverでの[]

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%' 
関連する問題