Когда параметр identity insert имеет значение off
Перейти к содержимому

Когда параметр identity insert имеет значение off

  • автор:

SET IDENTITY_INSERT (Transact-SQL)

Позволяет вставлять явные значения в столбец идентификаторов таблицы.

Синтаксис

 SET IDENTITY_INSERT [ [ database_name . ] schema_name . ] table_name

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

database_name
Имя базы данных, в которой находится указанная таблица.

schema_name
Имя схемы, которой принадлежит таблица.

table_name
Имя таблицы со столбцом идентификаторов.

Замечания

В каждый момент времени только для одной таблицы в сеансе свойство IDENTITY_INSERT может принимать значение ON. Если для таблицы уже задано значение ON, а инструкция SET IDENTITY_INSERT ON выдана для другой таблицы, SQL Server возвращает сообщение об ошибке, которое указывает, что set IDENTITY_INSERT уже включен и сообщает, что для нее задано значение ON.

Если вставленное значение больше текущего значения удостоверения для таблицы, SQL Server автоматически использует новое вставленное значение в качестве текущего значения удостоверения.

Задание параметра SET IDENTITY_INSERT происходит во время выполнения или запуска инструкций, а не их синтаксического анализа.

Разрешения

Пользователь должен быть владельцем таблицы или иметь разрешение ALTER на таблицу.

Примеры

В следующем примере создается таблица со столбцом идентификаторов, и показывается, как можно использовать параметр SET IDENTITY_INSERT для заполнения промежутков между значениями идентификаторов, вызванных выполнением инструкции DELETE .

USE AdventureWorks2022; GO -- Create tool table. CREATE TABLE dbo.Tool( ID INT IDENTITY NOT NULL PRIMARY KEY, Name VARCHAR(40) NOT NULL ); GO -- Inserting values into products table. INSERT INTO dbo.Tool(Name) VALUES ('Screwdriver') , ('Hammer') , ('Saw') , ('Shovel'); GO -- Create a gap in the identity values. DELETE dbo.Tool WHERE Name = 'Saw'; GO SELECT * FROM dbo.Tool; GO -- Try to insert an explicit ID value of 3; -- should return an error: -- An explicit value for the identity column in table 'AdventureWorks2022.dbo.Tool' can only be specified when a column list is used and IDENTITY_INSERT is ON. INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel'); GO -- SET IDENTITY_INSERT to ON. SET IDENTITY_INSERT dbo.Tool ON; GO -- Try to insert an explicit ID value of 3. INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel'); GO SELECT * FROM dbo.Tool; GO -- Drop products table. DROP TABLE dbo.Tool; GO 

Когда параметр identity insert имеет значение off

Здравствуйте!
Платформа 8.3.15.1830 (x64)

Хочу с помощью менеджера записи изменить значение одного поля, но выдается следующая ошибка:

: Ошибка при вызове метода контекста (Записать)
ЗаписьТаблицыВнешнейБД.Записать();
по причине:
Ошибка внешней базы данных:
ошибка при выполнении запроса
по причине:
Ошибка ODBC. SQLSTATE: 23000
Номер ошибки: 544
Описание: [Microsoft][SQL Server Native Client 11.0][SQL Server]Невозможно вставить явное значение для столбца идентификаторов в таблице «build_main», когда параметр IDENTITY_INSERT имеет значение OFF.

Собственно, вот кусок кода, где возникает ошибка:

ЗаписьТаблицыВнешнейБД = ВнешниеИсточникиДанных.УчетВесовогоМатериала.Таблицы.ОсновнаяТаблицаУчета.СоздатьМенеджерЗаписи();
ЗаписьТаблицыВнешнейБД.НомерСтроки = СтрокаТЗ.НомерСтроки;
ЗаписьТаблицыВнешнейБД.Прочитать();

ЗаписьТаблицыВнешнейБД.ЗагруженоВ1С = 1;
ЗаписьТаблицыВнешнейБД.Записать();

Основные свойства таблицы:
Тип данных таблицы внешнего источника данных — НеобъектныеДанные
Поле ключа — НомерСтроки
Только чтение — Ложь

У всех столбцов, кроме «ЗагруженоВ1С», свойство Только чтение установлено в значение Истина

Из-за чего может возникать ошибка?

Я так понимаю, что сама ошибка говорит о том, что я якобы пытаюсь вставить новую строку с установленным значением ключевого поля. Почитал описание процедуры Записать(), там действительно написано, что изменение записи происходит путем удаления текущей записи и вставки новой измененной. Так а почему оно не работает тогда? Поле ключа ведь обозначено как только для чтения, зачем 1С его заполняет, по логике, должна добавиться новая запись, с новым ID, но этого не происходит. Но этого и не хотелось бы, хочется, чтобы обычный UPDATE по ключу сработал. Никто не знает как с этим разобраться?

Ошибка когда параметр IDENTITY_INSERT имеет значение OFF WPF C# MS SQL

Добрый день, сообщество, выше дан код. При записи в базу, т.е. при нажатии кнопки срабатывает исключение:

Невозможно вставить явное значение для столбца идентификаторов в таблице «Student», когда параметр IDENTITY_INSERT имеет значение OFF.

Что делать? Идентификатор в БД для этой таблицы включён и начинается с 1.
Отслеживать
задан 7 мая 2023 в 4:44
e.shikhanov e.shikhanov
53 7 7 бронзовых знаков

Мало информации, скорее всего что-то можно найти в AppConnect, можно конечно ещё выставить SET IDENTITY_INSERT ON) Но скорее всего это наоборот всё поломает

Невозможно вставить явное значение для столбца идентификаторов в таблице ‘table’, когда для IDENTITY_INSERT установлено значение OFF

У меня есть следующая ошибка, когда я выполняю следующий script. Что такое ошибка и как ее можно решить?

Insert table(OperationID,OpDescription,FilterID) values (20,'Hierachy Update',1) 

Сервер: Msg 544, уровень 16, состояние 1, строка 1 Невозможно вставить явное значение для столбца идентификатора в таблице «table», если для параметра IDENTITY_INSERT установлено значение OFF.

pjp 26 авг. 2009, в 12:05
Поделиться
Поделиться:

12 ответов

Вы вставляете значения для OperationId , который является столбцом идентификатора . Вы можете включить идентификационную вставку в таблице так, чтобы вы могли указать свои собственные значения идентификации.

SET IDENTITY_INSERT Table1 ON INSERT INTO Table1 /*Note the column list is REQUIRED here, not optional*/ (OperationID, OpDescription, FilterID) VALUES (20, 'Hierachy Update', 1) SET IDENTITY_INSERT Table1 OFF 

pjp 26 авг. 2009, в 12:21
Поделиться

+1 точно — включите опцию , чтобы разрешить явные вставки ON, а затем вставить, а затем включите опцию снова OFF

marc_s 26 авг. 2009, в 11:37

Если вы действительно хотите добавить свое значение в столбец идентификаторов, это ваш ответ, но, с другой стороны, кто-то установил увеличение столбца при вставке. В этом случае таблица будет отслеживать следующий свободный номер, и вам не нужно будет генерировать OperationID самостоятельно. Новый идентификатор можно получить с помощью SELECT SCOPE_IDENTITY ().

Hakan Winther 26 авг. 2009, в 13:29

Опасная практика, не рекомендую использовать ее без предостережений, объясняющих, почему это плохая идея. Очень плохой ответ.

HLGEM 29 март 2011, в 13:34

хороший ответ, но убедитесь, что вы знаете, что делаете. Для меня полезно заполнить базу данных данными, в которых внешние ключи должны совпадать по разным таблицам

Berty 01 апр. 2014, в 09:50

@marc_s Зачем снова его выключать? Разве его нельзя просто включить, чтобы нам не нужно было включать / выключать его каждый раз, когда нам нужно вставить запись в таблицу?

Ulysses Alves 25 янв. 2017, в 12:43

@UlyssesAlves: эта опция может быть включена только для одной таблицы всей базы данных — поэтому, если вы оставите ее для одной таблицы, вы никогда не сможете использовать ее для другой таблицы. Кроме того: это не та опция, которую следует оставлять включенной — по умолчанию вы должны разрешить SQL Server обрабатывать значения идентификаторов — это предназначено только в качестве крайней меры для очень специфических случаев — не универсальная опция, которую следует оставить включенной или выключенной в Ваш досуг .

marc_s 25 янв. 2017, в 16:27
Показать ещё 4 комментария

Будьте очень осторожны при установке параметра IDENTITY_INSERT в положение ON. Это плохая практика, если база данных не находится в режиме обслуживания и не установлена ​​на одного пользователя. Это влияет не только на вашу вставку, но и на тех, кто пытается получить доступ к таблице.

Почему вы пытаетесь поместить значение в поле идентификации?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *