KONTROLA DBCC (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL database w usłudze Microsoft Fabric

Sprawdza bieżącą wartość tożsamości dla określonej tabeli w programie SQL Server, a w razie potrzeby zmienia wartość tożsamości. Możesz również użyć DBCC CHECKIDENT, aby ręcznie ustawić nową bieżącą wartość tożsamości dla kolumny tożsamości.

Ten artykuł oraz składnia IDENTITY różnią się na różnych platformach SQL Database Engine. Aby Microsoft Fabric Data Warehouse, wybierz Fabric Data Warehouse w rozwijanej liście wersji.

Transact-SQL konwencje składni

Składnia

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 ]

Składnia usługi Azure Synapse Analytics:

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

Argumenty

table_name

Nazwa tabeli, dla której ma być sprawdzana bieżąca wartość tożsamości. Tabela, którą wybierasz, musi zawierać kolumnę tożsamości. Nazwy tabel muszą być zgodne z regułami dotyczącymi identyfikatorów . Używaj ograniczników dla nazw dwu- lub trzyczęściowych, takich jak Person.AddressType lub [Person].[AddressType].

NORESEED

Określa, że nie należy zmieniać bieżącej wartości tożsamości.

RESEED

Określa, że należy zmienić bieżącą wartość tożsamości.

new_reseed_value

Nowa wartość, która ma być używana jako bieżąca wartość kolumny tożsamości.

Z NO_INFOMSGS

Pomija wszystkie komunikaty informacyjne.

Uwagi

Konkretne korekty wprowadzane DBCC CHECKIDENT do aktualnej wartości tożsamości zależą od specyfikacji parametrów.

DBCC CHECKIDENT polecenie Korekta tożsamości lub wprowadzone poprawki
DBCC CHECKIDENT (<table_name>, NORESEED) Bieżąca wartość tożsamości nie jest resetowany. DBCC CHECKIDENT zwraca bieżącą wartość tożsamości i bieżącą maksymalną wartość kolumny tożsamości. Jeśli te dwie wartości nie są takie same, zresetuj wartość tożsamości, aby uniknąć potencjalnych błędów lub luk w sekwencji wartości.
DBCC CHECKIDENT (<table_name>)

lub

DBCC CHECKIDENT (<table_name>, RESEED)
Jeśli aktualna wartość tożsamości dla tabeli jest mniejsza niż maksymalna wartość tożsamości zapisana w kolumnie tożsamości, resetuje ją, DBCC CHECKIDENT używając maksymalnej wartości w kolumnie tożsamości. Zobacz sekcję Wyjątki, która jest następująca.
DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) Bieżąca wartość tożsamości jest ustawiona na wartość new_reseed_value. Jeśli od momentu utworzenia tabeli nie zostaną wstawione żadne wiersze lub wszystkie wiersze zostaną usunięte za pomocą TRUNCATE TABLE instrukcji, pierwszy wiersz wstawiony po uruchomieniu DBCC CHECKIDENT służy new_reseed_value jako tożsamość. Jeśli w tabeli występują wiersze lub wszystkie wiersze zostaną usunięte za pomocą DELETE tego polecenia, następny wiersz wstawiony używa new_reseed_value wartości + aktualnej wartości przyrostu . Jeśli transakcja wstawia wiersz i jest później cofana do tyłu, kolejny wiersz wstawia + new_reseed_value bieżącą wartość przyrostu , jakby wiersz został usunięty. Jeśli tabela nie jest pusta, ustawienie wartości tożsamości na liczbę mniejszą niż wartość maksymalna w kolumnie tożsamości może spowodować powstanie jednego z następujących warunków:

- Jeśli na kolumnie identyczności istnieje ograniczenie PRIMARY KEY al UNIQUE , przy późniejszych operacjach wstawiania do tabeli generowany jest komunikat o błędzie 2627, ponieważ wygenerowana wartość tożsamości koliduje z istniejącymi wartościami.

- Jeśli ograniczenie lub PRIMARY KEYUNIQUE nie istnieje, późniejsze operacje wstawiania skutkują duplikacjami wartości tożsamości.

Wyjątki

W poniższej tabeli wymieniono warunki, gdy DBCC CHECKIDENT nie resetuje automatycznie bieżącej wartości tożsamości i zawiera metody resetowania wartości.

Warunek Metody resetowania
Bieżąca wartość tożsamości jest większa niż maksymalna wartość w tabeli. Wykonaj DBCC CHECKIDENT (<table_name>, NORESEED), aby określić bieżącą wartość maksymalną w kolumnie. Następnie określ wartość jako new_reseed_value w poleceniu DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>).

lub

Wykonaj DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) z new_reseed_value ustawioną na niską wartość, a następnie uruchom DBCC CHECKIDENT (<table_name>, RESEED), aby poprawić wartość.
Wszystkie wiersze są usuwane z tabeli. Wykonaj DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) z new_reseed_value ustawioną na nową wartość początkową.

Zmienianie wartości inicjatora

Wartość inicjowana to wartość wstawiona do kolumny tożsamości dla pierwszego wiersza załadowanego do tabeli. Wszystkie kolejne wiersze zawierają bieżącą wartość tożsamości oraz wartość przyrostu, w której bieżąca wartość tożsamości jest ostatnią wartością tożsamości wygenerowaną dla tabeli lub widoku.

Nie można użyć DBCC CHECKIDENT dla następujących zadań:

  • Zmień oryginalną wartość inicjatora określoną dla kolumny tożsamości podczas tworzenia tabeli lub widoku.

  • Przesuń istniejące wiersze w tabeli lub widoku.

Aby zmienić oryginalną wartość inicjatora i ponownie utworzyć wszystkie istniejące wiersze, upuść kolumnę tożsamości i utworzyć ją ponownie, określając nową wartość inicjatora. Gdy tabela zawiera dane, numery tożsamości są dodawane do istniejących wierszy z określonymi wartościami inicjacji i przyrostu. Kolejność aktualizowania wierszy nie jest gwarantowana.

Zestawy wyników

Niezależnie od tego, czy określono jakiekolwiek opcje dla tabeli zawierającej kolumnę tożsamości, DBCC CHECKIDENT zwraca następujący komunikat dla wszystkich operacji z wyjątkiem jednej. Ta operacja określa nową wartość inicjatora.

Sprawdzanie informacji o tożsamości: bieżąca wartość tożsamości "<bieżąca wartość tożsamości>", bieżąca wartość kolumny "<bieżąca wartość kolumny>". Ukończono wykonywanie polecenia DBCC. Jeśli komunikaty o błędach wydrukowane w bazie danych DBCC, skontaktuj się z administratorem systemu.

Gdy DBCC CHECKIDENT służy do określania nowej wartości inicjowania przy użyciu RESEED <new_reseed_value>, zwracany jest następujący komunikat.

Sprawdzanie informacji o tożsamości: bieżąca wartość tożsamości "<bieżąca wartość tożsamości>". Ukończono wykonywanie polecenia DBCC. Jeśli komunikaty o błędach wydrukowane w bazie danych DBCC, skontaktuj się z administratorem systemu.

Uprawnienia

Obiekt wywołujący musi być właścicielem schematu zawierającego tabelę lub być członkiem sysadmin stałej roli serwera, stałej roli bazy danych db_owner lub stałej roli db_ddladmin stałej bazy danych.

Usługa Azure Synapse Analytics wymaga db_owner uprawnień.

Przykłady

A. Zresetuj bieżącą wartość tożsamości, jeśli jest to potrzebne

Poniższy przykład resetuje aktualną wartość tożsamości, jeśli jest to potrzebne, dla określonej tabeli w bazie danych.

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

B. Zgłaszanie bieżącej wartości tożsamości

Poniższy przykład raportuje aktualną wartość tożsamości dla określonej tabeli w bazie danych i nie koryguje wartości tożsamości, jeśli jest nieprawidłowa.

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

C. Wymuszanie wartości bieżącej tożsamości na nową wartość

Poniższy przykład wymusza AddressType aktualną wartość tożsamości kolumny AddressTypeID w tabeli do wartości 10. Ponieważ tabela zawiera istniejące wiersze, kolejny wiersz wstawiony używa wartości 11. Nowa aktualna wartość tożsamości zdefiniowana dla kolumny plus 1 to wartość przyrostu kolumny.

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

D. Resetowanie wartości tożsamości w pustej tabeli

Poniższy przykład zakłada tożsamość tabeli i (1, 1) wymusza aktualną wartość tożsamości dla kolumny ErrorLogID w tabeli ErrorLog do wartości 1, po usunięciu wszystkich rekordów z tabeli. Ponieważ tabela nie zawiera istniejących wierszy, kolejny wstawiony wiersz używa wartości 1. Nowa aktualna wartość tożsamości bez dodawania wartości przyrostu zdefiniowanej dla kolumny po TRUNCATE lub dodawania wartości przyrostu 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

Dotyczy:Warehouse w usłudze Microsoft Fabric

Ponownie nasiewają wartość tożsamościową tabeli w Fabric Data Warehouse. Użyj DBCC CHECKIDENT po wstawieniu wartości jawnych z do SET IDENTITY_INSERT wyrównania zakresów tożsamości i zapobiegania konfliktom z przyszłymi automatycznie generowanymi wartościami.

Ten artykuł oraz składnia IDENTITY różnią się na różnych platformach SQL Database Engine.

Transact-SQL konwencje składni

Składnia

DBCC CHECKIDENT ( 'table_name' [ , RESEED ] )

Argumenty

table_name

Nazwa tabeli, dla której należy ponownie zasiewać wartość tożsamości. Tabela musi zawierać kolumnę tożsamości. Nazwy tabel mogą zawierać nazwę schematu, na przykład lub 'dbo.DimCustomer''[dbo].[DimCustomer]'.

RESEED

Słowo RESEED kluczowe jest opcjonalne, ale DBCC CHECKIDENT zawsze wykonuje operację ponownego seedu. Dodanie lub pominięcie opcji daje te same rezultaty.

Słowo RESEED kluczowe instruuje Database Engine do przeskanowania wszystkich używanych i zarezerwowanych zakresów tożsamości oraz ustawienia kolejnej wartości tożsamości, aby uniknąć konfliktów z istniejącymi wartościami. W Fabric Data Warehouse wykonuje RESEED skanowanie uwzględniające zasięg wszystkich rozproszonych węzłów obliczeniowych, aby określić poprawną kolejną wartość.

Uwagi

  • W Fabric Data Warehouse jedynym argumentem, który to wspiera, DBCC CHECKIDENT jest RESEED opcja, którą zawsze wykonuje. System automatycznie określa poprawne zakresy wartości kolejnej tożsamości na podstawie istniejących danych. Nie możesz określić niestandardowej wartości reseedu.
  • Zawsze uruchamiaj DBCC CHECKIDENT po użyciu IDENTITY_INSERT do wstawiania wartości jawnych. Ta operacja zapewnia, że przyszłe automatycznie generowane wartości nie kolidują z ręcznie wprowadzanymi wartościami.
  • W Fabric Data Warehouse nie jest obsługiwane określanie niestandardowego new_reseed_value ustawienia. Próba podania wartości zwraca następujący błąd: Specifying a custom seed in Fabric Data Warehouse is not supported.
  • DBCC CHECKIDENT zdobywa blokady, które mogą blokować jednoczesne operacje DML i DDL. Aby zminimalizować zakłócenia, wykonuj polecenie w izolacji, gdy inne procesy nie korzystają aktywnie z tabeli.

Uprawnienia

Musisz być właścicielem stołu lub mieć ALTER na niego pozwolenie.

Przykłady

A. Ponowne seedowanie po wstawieniu wartości sentinelowych

Po wypełnieniu wartości sentinel w tabeli wymiarowej za pomocą SET IDENTITY_INSERT, ponownie zasiewaj kolumnę tożsamości, aby zapobiec kolizji automatycznie generowanych wartości w przyszłości z ręcznie wprowadzonymi wartościami.

-- 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. Ponowne siew po migracji masowej

Po migracji danych historycznych z wyraźnymi wartościami tożsamości, ponownie zasiewaj tabelę, aby upewnić się, że nowe wiersze nie pokrywają się z przeniesionymi danymi.

-- 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 za pomocą IDENTITY_INSERT

Po załadowaniu danych z COPY INTO while IDENTITY_INSERT is ON, ponownie zasiedzi kolumnę tożsamości. COPY INTO Opcje nadpisują dowolne ustawienia na poziomie sesji dla 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 słowa kluczowego RESEED

Słowo RESEED kluczowe jest opcjonalne, ale DBCC CHECKIDENT zawsze wykonuje operację ponownego seedu. Dodanie lub pominięcie opcji daje te same rezultaty.

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

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