DBCC 查證人(Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 資料庫

檢查 SQL Server 中指定資料表的目前識別值,並視需要變更識別值。 您也可以使用 DBCC CHECKIDENT,手動設定識別欄位的新目前識別值。

本文及IDENTITY語法在不同平台的 SQL 資料庫引擎 上有所不同。 Microsoft Fabric Data Warehouse,請在版本下拉選單中選擇Fabric Data Warehouse

Transact-SQL 語法慣例

語法

Syntax for SQL Server, Azure SQL Database, Azure SQL 受控執行個體, SQL database in Fabric:

DBCC CHECKIDENT
 (
    table_name
        [ , { NORESEED | { RESEED [ , new_reseed_value ] } } ]
)
[ WITH NO_INFOMSGS ]

Azure Synapse Analytics 的語法:

DBCC CHECKIDENT
 (
    table_name
        [ RESEED , new_reseed_value ]
)
[ WITH NO_INFOMSGS ]

引數

table_name

要檢查目前識別值的資料表名稱。 你指定的表格必須包含一個身份欄位。 資料表名稱必須遵照識別碼的規則。 對於兩部分或三部分名稱,例如或,請Person.AddressType[Person].[AddressType]使用分隔符。

NORESEED

指定不應變更目前的識別值。

RESEED

指定應變更目前的識別值。

new_reseed_value

要作為識別欄位目前值的新值。

與NO_INFOMSGS

隱藏所有參考訊息。

備註

對當前恆等值所做的具體修正 DBCC CHECKIDENT 取決於參數規格。

DBCC CHECKIDENT 命令 進行的識別更正
DBCC CHECKIDENT (<table_name>, NORESEED) 不重設目前的識別值。 DBCC CHECKIDENT 會傳回識別欄位的目前識別值和目前最大值。 如果兩個值不相同,請重設身份值以避免數值序列中可能出現錯誤或缺口。
DBCC CHECKIDENT (<table_name>)



DBCC CHECKIDENT (<table_name>, RESEED)
如果資料表目前的身份值小於身份欄中儲存的最大身份值, DBCC CHECKIDENT 則會用身份欄中的最大值來重置。 請參閱稍後的例外狀況一節。
DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) 目前的識別值設定為 new_reseed_value。 如果自建立資料表以來沒有插入任何列,或是使用 TRUNCATE TABLE 該陳述式移除所有列,執行後 DBCC CHECKIDENT 插入的第一列將作為 new_reseed_value 身份。 如果表格中有列,或所有列都被用 陳述 DELETE 式移除,下一列插入的列會使用 new_reseed_value + 當前的增 量值。 如果交易插入一列後被回滾,下一列插入的列會使用 new_reseed_value + 當前的增 量值,就像該列被刪除一樣。 如果資料表不是空的,則將識別值設定為小於識別欄位中最大值的數字,可能會導致下列其中一種狀況:

- 若 PRIMARY KEY 身份欄位存在 OR UNIQUE 限制,後續插入操作時會產生錯誤訊息 2627,因為產生的身份值與現有值衝突。

- 若 PRIMARY KEY 不存在 OR UNIQUE 限制,後續插入操作會產生重複的身份值。

例外狀況

下表列出 DBCC CHECKIDENT 不會自動重設目前識別值的狀況,並提供重設值的方法。

條件 重設方法
目前的識別值大於資料表中的最大值。 執行 DBCC CHECKIDENT (<table_name>, NORESEED) 來判斷資料行中的目前最大值。 接下來,在 命令中將該值指定為 DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>)



執行 DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>),並將 new_reseed_value 設定為較低的值,然後執行 DBCC CHECKIDENT (<table_name>, RESEED) 來更正此值。
資料表中的所有資料列都遭到刪除。 執行 DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>),並將 new_reseed_value 設定為新的起始值。

變更種子值

初始值就是針對載入資料表的第一個資料列插入到識別欄位中的值。 所有後續資料列都會包含目前的識別值加上遞增值,其中目前的識別值就是針對資料表或檢視表所產生的最後一個識別值。

您無法使用 DBCC CHECKIDENT 來執行下列工作:

  • 變更建立資料表或檢視時針對識別欄位所指定的原始初始值。

  • 重設資料表或檢視表中現有的資料列。

若要變更原始初始值並重設任何現有的資料列,請卸除識別欄位並指定新的初始值來重建此識別欄位。 當資料表包含資料時,識別數字就會加入至含有指定初始值和遞增值的現有資料列。 但是,無法保證資料列的更新順序。

結果集

不論您是否為包含識別欄位的資料表指定任何選項,DBCC CHECKIDENT 都會針對所有作業傳回下列訊息 (只有一個例外)。 該作業會指定新的初始值。

正在檢查識別資訊: 目前的識別值 '<目前的識別值>',目前的資料行值 '<目前的資料行值>'。 DBCC 的執行已經完成。 如果 DBCC 印出錯誤訊息,請連絡您的系統管理員。

當使用 DBCC CHECKIDENT 來透過 RESEED <new_reseed_value> 指定新的種子值時,會傳回下列訊息。

正在檢查識別資訊: 目前的識別值 '<目前的識別值>'。 DBCC 的執行已經完成。 如果 DBCC 印出錯誤訊息,請連絡您的系統管理員。

權限

呼叫者必須擁有包含資料表的結構描述,或者必須是 sysadmin 固定伺服器角色、db_owner 固定資料庫角色,或 db_ddladmin 固定資料庫角色的成員。

Azure Synapse Analytics 需要 db_owner 權限。

範例

A. 必要的話,重設目前的識別值

以下範例可在需要時,重置資料庫中指定資料表的當前身份值。

USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType');
GO

B. 報告目前的識別值

以下範例報告資料庫中指定資料表的當前身份值,若身份值錯誤則不予修正。

USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType', NORESEED);
GO

C. 將目前的識別值強制設為新的值

以下範例強制該欄位AddressType的當前恆等值AddressTypeID為 10。 由於表格已有列,下一列插入時會使用 11 作為值。 欄位加 1 的新當前單位值即為該欄位的遞增值。

USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);
GO

D. 在空白資料表上重設識別值

以下範例假設資料(1, 1)表的同一性,並在刪除所有記錄後,強制該欄位ErrorLog的當前身份值ErrorLogID為 1。 由於資料表中沒有現有的列,下一列插入時會使用 1 作為值。 新的當前恆等值 ,未 加入 TRUNCATE 後欄位定義的遞增值,也未在 後加入遞增值 DELETE。

USE AdventureWorks2022;
GO
TRUNCATE TABLE dbo.ErrorLog
GO
DBCC CHECKIDENT ('dbo.ErrorLog', RESEED, 1);
GO
DELETE FROM dbo.ErrorLog
GO
DBCC CHECKIDENT ('dbo.ErrorLog', RESEED, 0);
GO

適用於:Microsoft Fabric 中的倉儲

在 Fabric Data Warehouse 中重新播種資料表的身份值。 插入明確值後使用 DBCC CHECKIDENTSET IDENTITY_INSERT 以重新對齊身份範圍,避免與未來自動產生的值衝突。

本文及IDENTITY語法在不同平台的 SQL 資料庫引擎 上有所不同。

Transact-SQL 語法慣例

語法

DBCC CHECKIDENT ( 'table_name' [ , RESEED ] )

引數

table_name

用來重新播種身份值的表格名稱。 表格必須包含一個身份欄位。 資料表名稱可以包含結構名稱,例如 'dbo.DimCustomer''[dbo].[DimCustomer]'

RESEED

RESEED關鍵字是可選的,但DBCC CHECKIDENT總是執行重新播種操作。 包含或省略選項,結果都是一樣的。

關鍵字指示 RESEED 資料庫引擎 掃描所有已使用及保留的身份範圍,並設定下一個身份值,以避免與現有值衝突。 在 Fabric Data Warehouse 中,RESEED執行範圍感知掃描,涵蓋所有分散式計算節點,以確定正確的下一個值。

備註

  • 在Fabric Data Warehouse中,唯一支持DBCC CHECKIDENT該選項的論點是RESEED選項,且它總是執行該選項。 系統會根據現有資料自動決定正確的下一個身份值範圍。 你無法指定自訂的重種值。
  • 每次使用IDENTITY_INSERT後執行DBCC CHECKIDENT以插入明確的數值。 此操作確保未來自動產生的值不會與手動插入的值發生衝突。
  • 在Fabric Data Warehouse中,不支援指定自訂new_reseed_value。 嘗試提供某個值時會回傳以下錯誤: Specifying a custom seed in Fabric Data Warehouse is not supported.
  • DBCC CHECKIDENT 取得可阻擋 DML 與 DDL 同時操作的鎖。 為了減少干擾,當其他程序沒有積極使用資料表時,請單獨執行該指令。

權限

你必須擁有該桌或擁有 ALTER 桌上許可。

範例

A. 插入哨兵值後重新播種

在將哨兵值填入維度表 SET IDENTITY_INSERT後,重新種子身份欄位,以防止未來自動產生的值與手動插入的值發生衝突。

-- Insert sentinel values
SET IDENTITY_INSERT dbo.DimCustomer ON;

INSERT INTO dbo.DimCustomer (CustomerKey, CustomerName)
VALUES (-1, 'Unknown'),
       (-2, 'Not Applicable');

SET IDENTITY_INSERT dbo.DimCustomer OFF;

-- Reseed to realign future identity values
DBCC CHECKIDENT('dbo.DimCustomer', RESEED);

B. 大量遷徙後重新播種

在遷移帶有明確身份值的歷史資料後,重新播種資料表,確保新資料列的值不會與遷移資料重疊。

-- After migrating data with IDENTITY_INSERT
DBCC CHECKIDENT('dbo.DimProduct', RESEED);

-- Future inserts receive auto-generated values beyond the migrated range
INSERT INTO dbo.DimProduct (ProductName, Category)
VALUES ('New Widget', 'Hardware');

C. 複製入體後重新種入 IDENTITY_INSERT

載入資料COPY INTOIDENTITY_INSERT時 ,當 是 ON,重新種子身份欄位。 COPY INTO 選項覆蓋了 對 的任何 IDENTITY_INSERT會話層級設定。

COPY INTO dbo.DimStore (StoreKey 1, StoreName 2, Region 3)
FROM 'https://storage.blob.core.windows.net/migration/dimstore.csv'
WITH (
    FILE_TYPE = 'CSV',
    IDENTITY_INSERT = 'ON'
);

-- Reseed after bulk load
DBCC CHECKIDENT('dbo.DimStore', RESEED);

D. 沒有 RESEED 關鍵字的 Reseed

RESEED關鍵字是可選的,但DBCC CHECKIDENT總是執行重新播種操作。 包含或省略選項,結果都是一樣的。

-- Reseed without the RESEED keyword
DBCC CHECKIDENT('dbo.DimStore');

-- Reseed with the RESEED keyword
DBCC CHECKIDENT('dbo.DimStore', RESEED);