ПРОВЕРКА DBCC (Transact-SQL)

Область применения:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureAzure Synapse AnalyticsБаза данных SQL в Microsoft Fabric

Проверяет текущее значение удостоверения для указанной таблицы в SQL Server и при необходимости изменяет значение удостоверения. Можно также использовать DBCC CHECKIDENT для ручного задания нового текущего значения удостоверения для столбца удостоверений.

Эта статья и синтаксис IDENTITY различаются на разных платформах SQL ядро СУБД. Для Microsoft Fabric Data Warehouse выберите Fabric Data Warehouse в выпадающем списке версий.

Соглашения о синтаксисе Transact-SQL

Синтаксис

Синтаксис для SQL Server, Azure SQL SQL Database, Azure SQL SQL Managed Instance, 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>)

or

DBCC CHECKIDENT (<table_name>, RESEED)
Если текущее значение идентичности таблицы меньше максимального значения идентичности, хранящегося в столбце идентичности, DBCC CHECKIDENT его сбрасывают, используя максимальное значение в столбце идентичности. См. раздел "Исключения", приведенный ниже.
DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) Текущее значение удостоверения имеет new_reseed_valueзначение . Если с момента создания таблицы в таблицу не вставлены строки, или все строки удаляются с помощью оператораTRUNCATE TABLE, первая строка, вставленная после запуска new_reseed_valueDBCC CHECKIDENT, используется в качестве идентичности. Если строки присутствуют в таблице или все строки удаляются с помощью DELETE оператора, следующая вставленная строка использует new_reseed_value + текущее значение прироста . Если транзакция вставляет строку и позже откатывается назад, следующая вставленная строка использует new_reseed_value + текущее значение прироста , как если бы строка была удалена. Если таблица не пустая, установка значения идентификатора меньше, чем максимальное значение столбца идентификаторов, может привести к одному из следующих условий:

- Если PRIMARY KEY ограничение UNIQUE или существует на столбце идентичности, при последующих операциях вставки в таблицу генерируется сообщение об ошибке 2627, поскольку сгенерированное значение идентичности конфликтует с существующими значениями.

- Если a PRIMARY KEYUNIQUE или не существует, последующие операции вставки приводят к дублирующим значениям идентичности.

Исключения

В следующей таблице перечислены условия, когда DBCC CHECKIDENT не сбрасывается текущее значение удостоверения и предоставляются методы для сброса значения.

Condition Способы сброса
Текущее значение идентификатора больше максимального значения в таблице. Выполните, DBCC CHECKIDENT (<table_name>, NORESEED) чтобы определить текущее максимальное значение в столбце. Затем укажите это значение в качестве new_reseed_value в команде DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) .

or

Выполните выполнение 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.

Примеры

А. Сброс текущего значения удостоверения, если это необходимо.

Следующий пример сбрасывает текущее значение идентичности, если это необходимо, для указанной таблицы в базе данных.

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

B. Сообщите о текущем значении удостоверения

Следующий пример показывает текущее значение идентификатора для указанной таблицы в базе данных и не исправляет значение идентичности, если оно неверно.

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

В. Принудительно принудить текущее значение удостоверения к новому значению

Следующий пример заставляет текущее значение тождественности столбца AddressTypeID в AddressType таблице равняться 10. Поскольку в таблице есть уже существующие строки, следующая вставленная строка использует значение 11 в качестве значения. Новое текущее значение идентичности, определённое для столбца плюс 1, — это значение увеличения столбца.

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

D. Сброс значения удостоверения в пустой таблице

Следующий пример предполагает тождественность таблицы и (1, 1) принуждает текущее значение столбца ErrorLogIDErrorLog в таблице быть равным 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 CHECKIDENT после вставки явных значений с SET 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 это опция, которую он всегда выполняет. Система автоматически определяет правильные диапазоны значений идентичности на основе существующих данных. Нельзя указать пользовательское значение переседа.
  • Всегда запускайте DBCC CHECKIDENT после использования IDENTITY_INSERT для вставки явных значений. Эта операция гарантирует, что будущие автоматически генерируемые значения не сталкиваются с вручную вставленными значениями.
  • В Fabric Data Warehouse указание пользовательского new_reseed_value не поддерживается. Попытка ввести значение приводит к следующей ошибке: Specifying a custom seed in Fabric Data Warehouse is not supported.
  • DBCC CHECKIDENT приобретает блокировки, способные блокировать параллельные операции DML и DDL. Чтобы минимизировать сбои, выполняйте команду в изоляции, когда другие процессы не используют таблицу активно.

Разрешения

Вы должны владеть столом или иметь ALTER разрешение на стол.

Примеры

А. Перезасев после вставки значений стражей

После заполнения значений сторожей в таблице размерностей с 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');

В. Перезасеять после COPY INTO с IDENTITY_INSERT

После загрузки данных с COPY INTO while IDENTITY_INSERT is 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 слово необязательно, но DBCC CHECKIDENT всегда выполняет операцию переседа. Включение или исключение её — результат одинаковый.

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

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