DBCC CHECKCONSTRAINTS (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance
現在のデータベースで、指定した制約や指定したテーブルのすべての制約に関する整合性をチェックします。
構文
DBCC CHECKCONSTRAINTS
[
(
table_name | table_id | constraint_name | constraint_id
)
]
[ WITH
[ { ALL_CONSTRAINTS | ALL_ERRORMSGS } ]
[ , ] [ NO_INFOMSGS ]
]
引数
table_name | table_id | constraint_name | constraint_id
チェックするテーブルまたは制約。 table_name または table_id を指定した場合は、そのテーブルで有効な制約がすべてチェックされます。 constraint_name または constraint_id を指定した場合は、その制約のみがチェックされます。 テーブル識別子も制約識別子も指定しない場合は、現在のデータベース内にあるすべてのテーブルで有効なすべての制約がチェックされます。
制約名によって、その制約が属するテーブルが一意に識別されます。 詳細については、「データベース識別子」を参照してください。
WITH
オプションを指定可能にします。
ALL_CONSTRAINTS
テーブル名を指定した場合、またはすべてのテーブルがチェックされる場合、テーブルのすべての有効な制約および無効な制約がチェックされます。それ以外の場合は、有効な制約のみがチェックされます。 制約名を指定した場合、
ALL_CONSTRAINTS
は無効になります。ALL_ERRORMSGS
チェック対象となるテーブル内の制約に違反する行をすべて返します。 既定では、先頭から 200 行までが返されます。
NO_INFOMSGS
すべての情報メッセージを表示しないようにします。
解説
DBCC CHECKCONSTRAINTS
を使うと、テーブルのすべての FOREIGN KEY 制約および CHECK 制約に対してクエリを作成し、実行することができます。
たとえば、外部キー クエリは次のような形式になります。
SELECT <columns>
FROM <table_being_checked> LEFT JOIN <referenced_table>
ON <table_being_checked.fkey1> = <referenced_table.pkey1>
AND <table_being_checked.fkey2> = <referenced_table.pkey2>
WHERE <table_being_checked.fkey1> IS NOT NULL
AND <referenced_table.pkey1> IS NULL
AND <table_being_checked.fkey2> IS NOT NULL
AND <referenced_table.pkey2> IS NULL;
クエリ データは temp テーブルに格納されます。 指定したすべてのテーブルまたは制約がチェックされた後、結果セットが返されます。
DBCC CHECKCONSTRAINTS
を使うと、FOREIGN KEY 制約と CHECK 制約の整合性をチェックできますが、テーブルのディスク上のデータ構造に関する整合性はチェックされません。 このようなデータ構造のチェックは、DBCC CHECKDB および DBCC CHECKTABLE で実行できます。
適用対象: SQL Server 2016 (13.x) 以降のバージョン
table_name または table_id が指定されており、システムのバージョン管理で有効になっている場合、DBCC CHECKCONSTRAINTS
を使って、指定したテーブルに対してテンポラル データの整合性チェックを実行することもできます。 このコマンドでは、NO_INFOMSGS が指定されていない場合、それぞれの整合性違反を別の行に出力します。 出力の形式は ([pkcol1], [pkcol2]..) = (<pkcol1_value>, <pkcol2_value>...)
と <what is wrong with temporal table record>
になります。
○ | チェックが失敗した場合の出力の追加情報 |
---|---|
PeriodEndColumn >= PeriodStartColumn (current) | [sys_end] = '{0}' AND MAX(DATETIME2) = '9999-12-31 23:59:59.99999' |
PeriodEndColumn >= PeriodStartColumn (current, history) | [sys_start] = '{0}' AND [sys_end] = '{1}' |
PeriodStartColumn < current_utc_time (current) | [sys_start] = '{0}' AND SYSUTCTIME |
PeriodEndColumn < current_utc_time (history) | [sys_end] = '{0}' AND SYSUTCTIME |
重複 | 2 つの重複するレコードの (sys_start1, sys_end1)、(sys_start2, sys_end2)。 重複するレコードが 2 つ以上ある場合、出力は複数行になり、各行で重複の各ペアが示されます。 |
テンポラル整合性チェックのみを実行するために、constraint_name
または constraint_id
を指定することはできません。
結果セット
DBCC CHECKCONSTRAINTS
から以下の列を含む行セットが返されます。
列名 | データ型 | 説明 |
---|---|---|
テーブル名 | varchar | テーブルの名前。 |
Constraint Name | varchar | 違反している制約の名前。 |
Where | varchar | 制約に違反している 1 つ以上の行を識別する列値の割り当て。 この列の値は、制約に違反する行をクエリする SELECT ステートメントの WHERE 句で使用できます。 |
DBCC CHECKCONSTRAINTS
には、"すべての" 制約違反を見つける保証はありません。 1 行が複数の制約に違反している場合、最初の違反の WHERE
句のみが列挙されます。 違反を生成する値の組み合わせが同じ別の行が存在し、その違反が最初の違反として検出された場合を除き、値の組み合わせは返される結果セットから欠落します。 データベース内のすべての制約違反を見つけるまでに、必要に応じて何度か DBCC CHECKCONSTRAINTS
を実行し、問題を修正します。
アクセス許可
sysadmin 固定サーバー ロールまたは db_owner 固定データベース ロールのメンバーシップが必要です。
例
A. テーブルをチェックする
次の例では、Table1
データベースにある AdventureWorks2022
テーブルの制約の整合性をチェックします。
USE AdventureWorks2022;
GO
CREATE TABLE Table1 (Col1 INT, Col2 CHAR(30));
GO
INSERT INTO Table1 VALUES (100, 'Hello');
GO
ALTER TABLE Table1 WITH NOCHECK ADD CONSTRAINT chkTab1 CHECK (Col1 > 100);
GO
DBCC CHECKCONSTRAINTS (Table1);
GO
B. 特定の制約をチェックする
次の例では、CK_ProductCostHistory_EndDate
制約の整合性をチェックします。
USE AdventureWorks2022;
GO
DBCC CHECKCONSTRAINTS ('Production.CK_ProductCostHistory_EndDate');
GO
C. すべてのテーブルについて、すべての有効な制約と無効な制約をチェックする
次の例では、現在のデータベース内にあるすべてのテーブルが持つ、すべての有効な制約と無効な制約の整合性をチェックします。
DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS;
GO