DBCC CHECKIDENT (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analyticssql database v Microsoft Fabric

Zkontroluje aktuální hodnotu identity pro zadanou tabulku v SQL Serveru a v případě potřeby změní hodnotu identity. Pomocí DBCC CHECKIDENT můžete také ručně nastavit novou aktuální hodnotu identity pro sloupec identity.

Tento článek a jeho IDENTITY syntax se liší na různých platformách SQL Database Engine. Pro Microsoft Fabric Data Warehouse vyberte Fabric Data Warehouse v rozbalovacím seznamu verzí.

Transact-SQL konvence syntaxe

Syntax

Syntax for SQL Server, Azure SQL Database, Azure SQL Managed Instance, SQL database in Fabric:

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

Syntaxe pro Azure Synapse Analytics:

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

Argumenty

table_name

Název tabulky, pro kterou chcete zkontrolovat aktuální hodnotu identity. Tabulka, kterou určíte, musí obsahovat sloupec identity. Názvy tabulek musí dodržovat pravidla pro identifikátory . Používejte oddělovače pro dvou- nebo třídílná jména, jako Person.AddressType je nebo [Person].[AddressType].

NORESEED

Určuje, že by se neměla změnit aktuální hodnota identity.

RESEED

Určuje, že by se měla změnit aktuální hodnota identity.

new_reseed_value

Nová hodnota, která se má použít jako aktuální hodnota sloupce identity.

S NO_INFOMSGS

Potlačí všechny informační zprávy.

Poznámky

Konkrétní korekce, které přinášejí DBCC CHECKIDENT aktuální identitní hodnotu, závisí na specifikacích parametrů.

DBCC CHECKIDENT příkaz Oprava identity nebo opravy provedené
DBCC CHECKIDENT (<table_name>, NORESEED) Aktuální hodnota identity se resetuje. DBCC CHECKIDENT vrátí aktuální hodnotu identity a aktuální maximální hodnotu sloupce identity. Pokud nejsou obě hodnoty stejné, resetujte identitní hodnotu, abyste předešli možným chybám nebo mezerám v posloupnosti hodnot.
DBCC CHECKIDENT (<table_name>)

nebo

DBCC CHECKIDENT (<table_name>, RESEED)
Pokud je aktuální hodnota identity tabulky menší než maximální hodnota identity uložená ve sloupci identity, DBCC CHECKIDENT resetujte ji použitím maximální hodnoty ve sloupci identity. Podívejte se na část Výjimky následující části.
DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) Aktuální hodnota identity je nastavena na new_reseed_value. Pokud od vytvoření tabulky nejsou do tabulky vloženy žádné řádky, nebo pokud jsou všechny řádky odstraněny pomocí příkazu TRUNCATE TABLE , první řádek vložený po spuštění DBCC CHECKIDENT slouží new_reseed_value jako identita. Pokud jsou v tabulce přítomny řádky, nebo pokud jsou všechny řádky odstraněny pomocí příkazu DELETE , další vložený řádek použije new_reseed_value + aktuální hodnotu přírůstku . Pokud transakce vloží řádek a je později vrácena zpět, další vložený řádek použije new_reseed_value + aktuální hodnotu přírůstku , jako by byl řádek smazán. Pokud tabulka není prázdná, nastavení hodnoty identity na číslo menší než maximální hodnota ve sloupci identity může mít za následek jednu z následujících podmínek:

- Pokud existuje omezení PRIMARY KEY nebo UNIQUE ve sloupci identity, při pozdějších vloženích operací do tabulky se vygeneruje chybová zpráva 2627, protože generovaná hodnota identity je v konfliktu s existujícími hodnotami.

- Pokud omezení nebo PRIMARY KEYUNIQUE neexistuje, pozdější operace s vložením vedou k duplicitním identitním hodnotám.

Výjimky

Následující tabulka uvádí podmínky, kdy DBCC CHECKIDENT automaticky neobnoví aktuální hodnotu identity a poskytuje metody pro resetování hodnoty.

Podmínka Metody resetování
Aktuální hodnota identity je větší než maximální hodnota v tabulce. Spuštěním DBCC CHECKIDENT (<table_name>, NORESEED) určete aktuální maximální hodnotu ve sloupci. V dalším kroku zadejte hodnotu jako new_reseed_value v příkazu DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>).

nebo

Spusťte DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) s new_reseed_value nastavenou na nízkou hodnotu a spuštěním DBCC CHECKIDENT (<table_name>, RESEED) hodnotu opravte.
Všechny řádky se z tabulky odstraní. Spusťte DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) s new_reseed_value nastavenou na novou počáteční hodnotu.

Změna počáteční hodnoty

Počáteční hodnota je hodnota vložená do sloupce identity prvního řádku načteného do tabulky. Všechny následující řádky obsahují aktuální hodnotu identity a hodnotu přírůstku, kde aktuální hodnota identity je poslední hodnota identity vygenerovaná pro tabulku nebo zobrazení.

Nemůžete použít DBCC CHECKIDENT pro následující úlohy:

  • Změňte původní počáteční hodnotu zadanou pro sloupec identity při vytvoření tabulky nebo zobrazení.

  • Převést existující řádky v tabulce nebo zobrazení.

Pokud chcete změnit původní počáteční hodnotu a znovu zadat všechny existující řádky, umístěte sloupec identity a znovu vytvořte novou počáteční hodnotu. Pokud tabulka obsahuje data, čísla identit se přidají do existujících řádků se zadanými počátečními a přírůstkovými hodnotami. Pořadí, ve kterém jsou řádky aktualizovány, není zaručeno.

Sady výsledků

Bez ohledu na to, zda zadáte jakékoli možnosti pro tabulku obsahující sloupec identity, DBCC CHECKIDENT vrátí následující zprávu pro všechny operace kromě jedné. Tato operace určuje novou počáteční hodnotu.

Kontrola informací o identitě: aktuální hodnota identity<aktuální hodnota identity>, aktuální hodnota sloupce<hodnotu aktuálního sloupce>. Provádění DBCC bylo dokončeno. Pokud dbCC vytiskne chybové zprávy, obraťte se na správce systému.

Pokud DBCC CHECKIDENT slouží k zadání nové počáteční hodnoty pomocí RESEED <new_reseed_value>, vrátí se následující zpráva.

Kontrola informací o identitě: aktuální hodnota identity<aktuální hodnota identity>. Provádění DBCC bylo dokončeno. Pokud dbCC vytiskne chybové zprávy, obraťte se na správce systému.

Dovolení

Volající musí vlastnit schéma, které obsahuje tabulku, nebo být členem správce systému pevné role serveru, db_owner pevné databázové role nebo db_ddladmin pevné databázové role.

Azure Synapse Analytics vyžaduje db_owner oprávnění.

Příklady

A. V případě potřeby resetujte aktuální hodnotu identity.

Následující příklad resetuje aktuální hodnotu identity, pokud je to potřeba, pro specifikovanou tabulku v databázi.

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

B. Sestava aktuální hodnoty identity

Následující příklad uvádí aktuální hodnotu identity pro zadanou tabulku v databázi a neopravuje hodnotu identity, pokud je nesprávná.

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

C. Vynucení aktuální hodnoty identity na novou hodnotu

Následující příklad nutí AddressType aktuální identitní hodnotu sloupce AddressTypeID v tabulce na hodnotu 10. Protože tabulka obsahuje již existující řádky, další vložený řádek používá hodnotu 11. Nová aktuální hodnota identity definovaná pro sloupec plus 1 je hodnota přírůstku sloupce.

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

D. Resetování hodnoty identity v prázdné tabulce

Následující příklad předpokládá identitu tabulky a (1, 1) nutí aktuální hodnotu identity sloupce ErrorLogID tabulky ErrorLog na hodnotu 1 po smazání všech záznamů z tabulky. Protože tabulka nemá žádné existující řádky, další vložený řádek používá hodnotu 1. Nová aktuální hodnota identity bez přidání hodnoty přírůstku definované pro sloupec po TRUNCATE, nebo přidání hodnoty přírůstku po 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

platí pro:Warehouse v Microsoft Fabric

Znovu seje identitní hodnotu tabulky v Fabric Data Warehouse. Použijte DBCC CHECKIDENT po vložení explicitních hodnot s k SET IDENTITY_INSERT přerovnání rozsahu identity a prevenci konfliktů s budoucími automaticky generovanými hodnotami.

Tento článek a jeho IDENTITY syntax se liší na různých platformách SQL Database Engine.

Transact-SQL konvence syntaxe

Syntax

DBCC CHECKIDENT ( 'table_name' [ , RESEED ] )

Argumenty

table_name

Název tabulky, pro kterou se má přesedávat hodnota identity. Tabulka musí obsahovat sloupec identity. Názvy tabulek mohou obsahovat název schématu, například 'dbo.DimCustomer' nebo '[dbo].[DimCustomer]'.

RESEED

Klíčové slovo RESEED je volitelné, ale DBCC CHECKIDENT vždy provádí operaci opětovného seedování. Zahrnutí nebo její vynechání přináší stejné výsledky.

Klíčové RESEED slovo instruuje Database Engine, aby prohledal všechny použité a rezervované rozsahy identit a nastavil další hodnotu identity, aby se předešlo konfliktům s existujícími hodnotami. V Fabric Data Warehouse provede rozsah povědomého skenování všech distribuovaných výpočetních uzlů, RESEED aby určil správnou další hodnotu.

Poznámky

  • V Fabric Data Warehouse jediným argumentem, který podporujeDBCC CHECKIDENT, je RESEED option, kterou vždy vykoná. Systém automaticky určuje správné rozsahy hodnoty další identity na základě existujících dat. Nemůžeš si zadat vlastní hodnotu přeseedování.
  • Vždy spusťte DBCC CHECKIDENT po použití pro IDENTITY_INSERT vložení explicitních hodnot. Tato operace zajišťuje, že budoucí automaticky generované hodnoty nekolidují s ručně vloženými hodnotami.
  • V Fabric Data Warehouse není podporováno specifikování vlastního new_reseed_value režimu. Pokus o zadání hodnoty vrátí následující chybu: Specifying a custom seed in Fabric Data Warehouse is not supported.
  • DBCC CHECKIDENT získává zámky, které mohou blokovat současné operace DML a DDL. Pro minimalizaci narušení spusťte příkaz izolovaně, když jiné procesy tabulku aktivně nepoužívají.

Dovolení

Musíte vlastnit stůl nebo mít ALTER povolení k jeho umístění.

Příklady

A. Reseed po vložení hodnot sentinel

Po naplnění hodnot sentinel v tabulkě rozměrů , SET IDENTITY_INSERTznovu seedujte sloupec identity, aby se zabránilo kolizi budoucích automaticky generovaných hodnot s ručně vloženými hodnotami.

-- 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. Znovu osetí po hromadné migraci

Po migraci historických dat s explicitními hodnotami identity znovu seedujte tabulku, aby nové řádky obdržely hodnoty, které se nepřekrývají s migrovanými daty.

-- 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. Reseed po COPY INTO pomocí IDENTITY_INSERT

Po načtení dat s COPY INTO while IDENTITY_INSERT is ON, znovu seedujte sloupec identity. COPY INTO Možnosti přepisují jakékoli nastavení na úrovni relace pro 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 bez klíčového slova RESEED

Klíčové slovo RESEED je volitelné, ale DBCC CHECKIDENT vždy provádí operaci opětovného seedování. Zahrnutí nebo její vynechání přináší stejné výsledky.

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

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