DBCC CHECKCONSTRAINTS (Transact-SQL)
適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體
檢查目前資料庫中之指定資料表的指定條件約束或所有條件約束的完整性。
Syntax
DBCC CHECKCONSTRAINTS
[
(
table_name | table_id | constraint_name | constraint_id
)
]
[ WITH
[ { ALL_CONSTRAINTS | ALL_ERRORMSGS } ]
[ , ] [ NO_INFOMSGS ]
]
注意
若要檢視 SQL Server 2014 與更早版本的 Transact-SQL 語法,請參閱舊版文件。
引數
table_name | table_id | constraint_name | constraint_id
要檢查的資料表或條件約束。 指定 table_name 或 table_id 時,就會檢查該資料表所有已啟用的條件約束。 指定 constraint_name 或 constraint_id 時,只會檢查該條件約束。 如果未指定資料表識別碼或條件約束識別碼,就會檢查目前資料庫的所有資料表中所有已啟用的條件約束。
條件約束名稱會唯一識別它所屬的資料表。 如需詳細資訊,請參閱< Database Identifiers>。
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;
查詢資料儲存在暫存資料表中。 在檢查了所有要求的資料表或條件約束之後,會傳回結果集。
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>...)
AND <what is wrong with temporal table record>
。
勾選 | 檢查失敗時輸出中的其他資訊 |
---|---|
PeriodEndColumn >= PeriodStartColumn (目前) | [sys_end] = '{0}' AND MAX(DATETIME2) = '9999-12-31 23:59:59.99999' |
PeriodEndColumn >= PeriodStartColumn (目前, 歷程記錄) | [sys_start] = '{0}' AND [sys_end] = '{1}' |
PeriodStartColumn < current_utc_time (目前) | [sys_start] = '{0}' AND SYSUTCTIME |
PeriodEndColumn < current_utc_time (歷程記錄) | [sys_end] = '{0}' AND SYSUTCTIME |
重疊 | 兩筆重疊記錄為 (sys_start1, sys_end1) , (sys_start2, sys_end2)。 如果有 2 筆以上的重疊記錄,輸出將有多個資料列,每個資料列顯示一組重疊。 |
您無法指定 constraint_name
或 constraint_id
以僅執行時態性一致性檢查。
結果集
DBCC CHECKCONSTRAINTS
會傳回含有下列資料行的資料列集。
資料行名稱 | 資料類型 | 描述 |
---|---|---|
資料表名稱 | varchar | 資料表的名稱。 |
Constraint Name | varchar | 違反的條件約束名稱。 |
Where | varchar | 用來識別違反條件約束的一個或多個資料列的資料行值指派。 在查詢違反條件約束的資料列之 SELECT 陳述式的 WHERE 子句中,可以使用這個資料行中的值。 |
DBCC CHECKCONSTRAINTS
不保證會尋找「所有」強制違規。 如果單一資料列違反多個條件約束,則只會列出第一個違規的 WHERE
子句。 除非有另一個資料列具有產生違規的相同值組合,且該違規是找到的第一個違規,否則傳回的結果集中將會遺漏值的組合。 您可能必須先執行 DBCC CHECKCONSTRAINTS
並修正問題數次,才能在資料庫中尋找所有強制違規。
權限
需要 系統管理員 固定伺服器角色或 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