CONTROLLO DBCC (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsDatabase SQL in Microsoft Fabric

Controlla il valore Identity corrente per la tabella specificata in SQL Server e, se necessario, modifica il valore identity. È anche possibile usare DBCC CHECKIDENT per impostare manualmente un nuovo valore Identity corrente per la colonna Identity.

Questo articolo e la IDENTITY sintassi differiscono tra le diverse piattaforme del SQL motore di database. Per Microsoft Fabric Data Warehouse, seleziona Fabric Data Warehouse nell'elenco a tendina delle versioni.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

Sintassi per SQL Server, database SQL di Azure, Istanza gestita di SQL di Azure, database SQL in Fabric:

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

Sintassi per Azure Synapse Analytics:

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

Argomenti

table_name

Nome della tabella per cui controllare il valore Identity corrente. La tabella che specifichi deve contenere una colonna identità. I nomi delle tabelle devono essere conformi alle regole per gli identificatori. Usa delimitatori per nomi a due o tre parti, come Person.AddressType o [Person].[AddressType].

NORESEED

Specifica che non è necessario modificare il valore Identity corrente.

RESEED

Specifica che è necessario modificare il valore Identity corrente.

new_reseed_value

Nuovo valore da utilizzare come valore corrente della colonna Identity.

CON NO_INFOMSGS

Disattiva tutti i messaggi informativi.

Osservazioni:

Le correzioni specifiche che DBCC CHECKIDENT apporta al valore identità corrente dipendono dalle specifiche dei parametri.

DBCC CHECKIDENT comando Correzione o correzioni Identity apportate
DBCC CHECKIDENT (<table_name>, NORESEED) Il valore Identity corrente non viene reimpostato. DBCC CHECKIDENT restituisce il valore Identity corrente e il valore massimo corrente della colonna Identity. Se i due valori non sono uguali, azzera il valore identità per evitare possibili errori o lacune nella sequenza dei valori.
DBCC CHECKIDENT (<table_name>)

or

DBCC CHECKIDENT (<table_name>, RESEED)
Se il valore identità corrente di una tabella è inferiore al valore identitario massimo memorizzato nella colonna identità, DBCC CHECKIDENT lo resetta usando il valore massimo nella colonna identità. Vedere la sezione Eccezioni riportata di seguito.
DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) Il valore Identity corrente è impostato su new_reseed_value. Se non vengono inserite righe nella tabella da quando la tabella è stata creata, o se tutte le righe vengono rimosse usando l'istruzione TRUNCATE TABLE , la prima riga inserita dopo l'esecuzione DBCC CHECKIDENT viene utilizzata new_reseed_value come identità. Se sono presenti righe nella tabella, o se tutte le righe vengono rimosse usando l'istruzione DELETE , la riga successiva inserita usa new_reseed_value + il valore attuale dell'incremento . Se una transazione inserisce una riga e poi viene annullata indietro, la riga successiva inserita usa new_reseed_value + il valore attuale di incremento come se la riga fosse stata eliminata. Se la tabella non è vuota, l'impostazione del valore Identity su un numero inferiore al valore massimo della colonna Identity può determinare una delle condizioni seguenti:

- Se esiste un PRIMARY KEY vincolo or UNIQUE sulla colonna identità, il messaggio di errore 2627 viene generato nelle operazioni successive di inserimento nella tabella perché il valore identità generato è in conflitto con i valori esistenti.

- Se non esiste un PRIMARY KEY vincolo o UNIQUE o (o vincolo o), operazioni successive di inserimento producono valori identità duplicati.

Eccezioni

La tabella seguente elenca le condizioni quando DBCC CHECKIDENT non reimposta automaticamente il valore Identity corrente e fornisce metodi per reimpostare il valore.

Condizione Metodi di reimpostazione
Il valore Identity corrente è maggiore del valore massimo della tabella. Eseguire DBCC CHECKIDENT (<table_name>, NORESEED) per determinare il valore massimo corrente nella colonna. Specificare quindi tale valore come new_reseed_value in un DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) comando.

or

Eseguire DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) con new_reseed_value impostato su un valore basso e quindi eseguire DBCC CHECKIDENT (<table_name>, RESEED) per correggere il valore.
Tutte le righe sono state eliminate dalla tabella. Eseguire DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) con new_reseed_value impostato sul nuovo valore iniziale.

Modificare il valore di inizializzazione

Il valore di inizializzazione è il valore inserito in una colonna Identity per la prima riga caricata nella tabella. Tutte le righe successive contengono il valore Identity corrente più il valore dell'incremento dove il valore Identity corrente è l'ultimo valore Identity generato per la tabella o vista.

Non è possibile usare DBCC CHECKIDENT per le attività seguenti:

  • Modificare il valore di inizializzazione originale specificato per una colonna Identity quando è stata creata la tabella o la vista.

  • Reinizializzare righe esistenti in una tabella o vista.

Per modificare il valore di inizializzazione originale e reinizializzare le eventuali righe esistenti, eliminare la colonna Identity e ricrearla specificando il nuovo valore di inizializzazione. Quando la tabella contiene dati, i numeri di identità vengono aggiunti alle righe esistenti con i valori di inizializzazione e incremento specificati. L'ordine con cui le righe vengono aggiornate non è prevedibile.

Set di risultati

Indica se si specificano o meno opzioni per una tabella contenente una colonna Identity, DBCC CHECKIDENT restituisce il messaggio seguente per tutte le operazioni tranne una. ovvero quando si specifica un nuovo valore di inizializzazione.

Verifica delle informazioni sull'identità: valore identity corrente '<valore identity> corrente', valore di colonna corrente '<valore> colonna corrente'. Esecuzione DBCC completata. Se sono stati visualizzati messaggi di errore DBCC, rivolgersi all'amministratore di sistema.

Quando DBCC CHECKIDENT viene usato per specificare un nuovo valore di inizializzazione tramite RESEED <new_reseed_value>, viene restituito il messaggio seguente.

Verifica delle informazioni sull'identità: valore identity corrente '<valore> identity corrente'. Esecuzione DBCC completata. Se sono stati visualizzati messaggi di errore DBCC, rivolgersi all'amministratore di sistema.

Autorizzazioni

Il chiamante deve essere proprietario dello schema contenente la tabella o membro del ruolo predefinito del server sysadmin o dei ruoli predefiniti del database db_owner e db_ddladmin.

Azure Synapse Analytics richiede autorizzazioni di db_owner.

Esempi

R. Reimpostare il valore identity corrente, se necessario

Il seguente esempio reimposta il valore identitario corrente, se necessario, per la tabella specificata nel database.

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

B. Segnalare il valore identity corrente

L'esempio seguente riporta il valore identità corrente per la tabella specificata nel database e non corregge il valore identità se è errato.

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

C. Forzare il valore Identity corrente a un nuovo valore

Il seguente esempio costringe il valore identitario corrente della AddressTypeID colonna nella AddressType tabella a 10. Poiché la tabella contiene righe esistenti, la riga successiva inserita usa 11 come valore. Il nuovo valore identitario corrente definito per la colonna più 1 è il valore incrementale della colonna.

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

D. Reimpostare il valore Identity in una tabella vuota

Il seguente esempio assume un'identità di tabella e (1, 1) forza il valore identitario corrente della ErrorLogID colonna nella ErrorLog tabella a 1, dopo aver eliminato tutti i record dalla tabella. Poiché la tabella non ha righe esistenti, la riga successiva inserita usa 1 come valore. Il nuovo valore di identità corrente senza aggiungere il valore di incremento definito per la colonna dopo TRUNCATE, o aggiungere il valore di incremento dopo 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

Si applica a:Warehouse in Microsoft Fabric

Risemina il valore identità di una tabella in Fabric Data Warehouse. Usare DBCC CHECKIDENT dopo aver inserito valori espliciti per SET IDENTITY_INSERT riallineare gli intervalli di identità e prevenire conflitti con i valori generati automaticamente in futuro.

Questo articolo e la IDENTITY sintassi differiscono tra le diverse piattaforme del SQL motore di database.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

DBCC CHECKIDENT ( 'table_name' [ , RESEED ] )

Argomenti

table_name

Il nome della tabella per cui ripartire il valore identità. La tabella deve contenere una colonna identità. I nomi delle tabelle possono includere il nome dello schema, come 'dbo.DimCustomer' o '[dbo].[DimCustomer]'.

RESEED

La RESEED parola chiave è opzionale, ma DBCC CHECKIDENT esegue sempre l'operazione di reseed. Includere o omettere l'opzione produce gli stessi risultati.

La RESEED parola chiave istruisce il motore di database a scansionare tutti gli intervalli di identità utilizzati e riservati e a impostare il valore di identità successivo per evitare conflitti con i valori esistenti. In Fabric Data Warehouse, RESEED viene effettuata una scansione consapevoli dell'intervallo su tutti i nodi di calcolo distribuiti per determinare il valore successivo corretto.

Osservazioni:

  • In Fabric Data Warehouse, l'unico argomento che DBCC CHECKIDENT sostiene è l'opzioneRESEED, che essa esegue sempre. Il sistema determina automaticamente i corretti intervalli di valore di identità successiva basandosi sui dati esistenti. Non puoi specificare un valore di reseed personalizzato.
  • Esegui DBCC CHECKIDENT sempre dopo aver inserito IDENTITY_INSERT valori espliciti. Questa operazione garantisce che i valori generati automaticamente futuri non collidano con i valori inseriti manualmente.
  • In Fabric Data Warehouse, specificare una personalizzazione new_reseed_value non è supportato. Tentando di fornire un valore restituisce il seguente errore: Specifying a custom seed in Fabric Data Warehouse is not supported.
  • DBCC CHECKIDENT acquisisce lock che possono bloccare operazioni DML e DDL contemporanee. Per minimizzare le interruzioni, esegui il comando in isolamento quando altri processi non stanno usando attivamente la tabella.

Autorizzazioni

Devi possedere il tavolo o avere ALTER il permesso di esserlo.

Esempi

R. Risemina dopo aver inserito i valori sentinella

Dopo aver popolato i valori sentinella in una tabella delle dimensioni con SET IDENTITY_INSERT, riseed la colonna identità per evitare che i futuri valori generati automaticamente collidano con quelli inseriti manualmente.

-- 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. Risemina dopo la migrazione in massa

Dopo aver migrato i dati storici con valori di identità espliciti, riseed la tabella per assicurarti che le nuove righe ricevano valori che non si sovrappongono ai dati migrati.

-- 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 dopo COPY INTO con IDENTITY_INSERT

Dopo aver caricato i dati con COPY INTO mentre IDENTITY_INSERT è ON, riseed la colonna identità. COPY INTO Le opzioni sovrascrivono qualsiasi impostazione a livello di sessione per 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 senza la parola chiave RESEED

La RESEED parola chiave è opzionale, ma DBCC CHECKIDENT esegue sempre l'operazione di reseed. Includere o omettere l'opzione produce gli stessi risultati.

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

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