Как исправить ошибку «Невозможно вставить явное значение для столбца идентификаторов в таблицу, когда для IDENTITY_INSERT установлено значение OFF»?
Столбец первичного ключа часто устанавливается на автоинкремент при построении базы данных SQL Server. Для этого устанавливается ограничение IDENTITY для столбца первичного ключа. Начальная позиция и шаг приращения передаются в столбец IDENTITY в качестве параметров. Затем всякий раз, когда добавляется новая запись и для вставки идентификатора установлено значение OFF, значение столбца IDENTITY увеличивается на заранее определенный шаг, как правило, на число. Более того, для свойства IDENTITY INSERT установлено значение ON только для одной таблицы в одном сеансе.
В этой статье мы обсудим ошибку «Невозможно вставить явное значение для столбца идентификаторов. в таблице

Ошибка возникает, когда пользователь установил для параметра «identity_insert» значение «OFF». Затем пытается явно вставить данные в столбец первичного ключа таблицы. Это можно объяснить на примере ниже.
Создание базы данных и таблицы:
Сначала создайте базу данных с именем «appuals».

Создайте таблицу с именем «person», используя следующий код. Созданная таблица с использованием «PRIMARY KEY IDENTITY»

Синтаксис для установки «identity_insert off | on »:
Параметр « установить identity_insert off | on » поможет нам устранить эту ошибку. Правильный синтаксис этого оператора следующий:
Тогда как первый аргумент – это имя базы данных, в которой расположена таблица. Второй аргумент, который показывает , – это схема, к которой принадлежит эта таблица, для которой необходимо установить значение идентификатора ON или OFF . Третий аргумент
Существует два основных способа безошибочной вставки данных в таблицу. Они рассматриваются как решение этой ошибки и обсуждаются ниже.
Ошибка 1: установите identity_insert OFF
В первом случае мы вставим данные в таблицу с «IDENTITY INSERT» , установленным на «OFF» . Таким образом, если идентификатор присутствует в операторе INSERT, вы получите ошибку «Невозможно вставить явное значение для столбца идентификаторов в таблицу ‘person’, когда для IDENTITY_INSERT установлено значение OFF».
Выполните следующий код на вкладке запроса.
Результат будет таким.

Решение:
При выключении « IDENTITY INSERT OFF » « PRIMARY KEY ID » НЕ ДОЛЖЕН ПРИСУТСТВОВАТЬ в операторе вставки
Теперь выполните следующий код на вкладке запроса

Это вставит данные в таблицу без ошибок. Более того, ПЕРВИЧНЫЙ КЛЮЧ ID не требуется вводить пользователем, скорее, он автоматически добавит уникальное значение ID, как показано на рисунке ниже.
Ошибка 2: Установите identity_insert ON
Во втором случае мы будем вставлять данные в таблицу с «IDENTITY INSERT» , установленным на «ON» . Таким образом, если идентификатор не указан в операторе INSERT, вы получите сообщение об ошибке «», сообщение 545, уровень 16, состояние 1, строка 17. Для столбца идентификаторов в таблице «person» необходимо указать явное значение. либо когда для IDENTITY_INSERT установлено значение ON, либо когда пользователь репликации вставляет данные в столбец идентификаторов NOT FOR REPLICATION ».

Решение:
При включении « IDENTITY INSERT ON » « PRIMARY KEY ID » должен присутствовать в операторе вставки.
Выполните следующий код на вкладке запроса

Это вставит данные в таблицу без ошибок. Таким образом, ИДЕНТИФИКАТОР ПЕРВИЧНОГО КЛЮЧА явно должен быть вставлен пользователем. Кроме того, он не будет автоматически добавлять значение уникального идентификатора, как показано на рисунке ниже.
Если вы « SET IDENTITY INSERT ON» , он останется включенным для всю сессию. Таким образом, вы можете добавить столько записей, сколько захотите, как только это будет установлено. Это также относится только к сеансу, в котором он включен. Поэтому, если вы откроете другую вкладку запроса, вам нужно снова включить ее ON для этого окна запроса.
IDENTITY_INSERT is set to off error
I have a MVC web application with a table in the model that I would like to add to. I have the primary key set along with the other data fields, but every time I try to add to the table, I get the following error:
«Cannot insert explicit value for identity column in table ‘TABLE_NAME’ when IDENTITY_INSERT is set to OFF.»
I’m not sure why this problem is coming up, I have the primary key set as the identity and it is also set to auto increment in the Visual Studio table designer. Is there any way I can adjust the IDENTITY_INSERT parameter in the table designer in Visual Studio?? Or is there some other issue that might be causing this.
UPDATE: @Brian — As far as I can tell, I’m not setting the value explicitly, here is the code that adds to the table(s).
5 Answers 5
It would seem that your code is trying to insert a specific value into the primary key column that is defined as IDENTITY.
To avoid the error — do not insert any values! Let the database handle getting a new value for the row you’re inserting.
If you’re using Linq-to-SQL, click on the table in question in your visual designer, and have a look at the properties:
The «Auto Generated Value» must be «True» (which is not the default), and the Auto-Sync should be «OnInsert» (again: not the default). Also, set the «Primary Key» to true, and check to make sure the «Server Data Type» is correct — Int NOT NULL IDENTITY (or something like that).
If you ever need to override the default behavior (typically only in clean-up scripts or one-off data manipulations), you can turn ON the IDENTITY_INSERT on a table, e.g. after that, you can insert any value you like into the IDENTITY column:
This is more of a cleanup / data admin kind of task — not something you should do all the time as a dev.
Внешние источники данных IDENTITY_INSERT имеет значение OFF
Хочу с помощью менеджера записи изменить значение одного поля, но выдается следующая ошибка:
<ОбщийМодуль.ОбработчикиСобытий.Модуль(666)>: Ошибка при вызове метода контекста (Записать)
ЗаписьТаблицыВнешнейБД.Записать();
по причине:
Ошибка внешней базы данных:
ошибка при выполнении запроса
по причине:
Ошибка ODBC. SQLSTATE: 23000
Номер ошибки: 544
Описание: [Microsoft][SQL Server Native Client 11.0][SQL Server]Невозможно вставить явное значение для столбца идентификаторов в таблице "build_main", когда параметр IDENTITY_INSERT имеет значение OFF.
Собственно, вот кусок кода, где возникает ошибка:
ЗаписьТаблицыВнешнейБД = ВнешниеИсточникиДанных.УчетВесовогоМатериала.Таблицы.ОсновнаяТаблицаУчета.СоздатьМенеджерЗаписи();
ЗаписьТаблицыВнешнейБД.НомерСтроки = СтрокаТЗ.НомерСтроки;
ЗаписьТаблицыВнешнейБД.Прочитать();
ЗаписьТаблицыВнешнейБД.ЗагруженоВ1С = 1;
ЗаписьТаблицыВнешнейБД.Записать();
Основные свойства таблицы:
Тип данных таблицы внешнего источника данных — НеобъектныеДанные
Поле ключа — НомерСтроки
Только чтение — Ложь
У всех столбцов, кроме "ЗагруженоВ1С", свойство Только чтение установлено в значение Истина
Из-за чего может возникать ошибка?
Я так понимаю, что сама ошибка говорит о том, что я якобы пытаюсь вставить новую строку с установленным значением ключевого поля. Почитал описание процедуры Записать(), там действительно написано, что изменение записи происходит путем удаления текущей записи и вставки новой измененной. Так а почему оно не работает тогда? Поле ключа ведь обозначено как только для чтения, зачем 1С его заполняет, по логике, должна добавиться новая запись, с новым ID, но этого не происходит. Но этого и не хотелось бы, хочется, чтобы обычный UPDATE по ключу сработал. Никто не знает как с этим разобраться?
При изменении данных обновляются значения всех полей таблицы, у которых ТолькоЧтение = Ложь.
Если же необходимо записать только некоторые поля, вы можете указать их перечень прямо из встроенного языка с помощью методов УстановитьЗаписываемыеПоля() и ПолучитьЗаписываемыеПоля().
(11) вот я как раз для всех полей таблицы, кроме "ЗагруженоВ1С" и установил ТолькоЧтение = Истина, поэтому при изменении должно обновляться только поле "ЗагруженоВ1С"
УстановитьЗаписываемыеПоля() и ПолучитьЗаписываемыеПоля() работает для таблиц с объектными данными
но я не пробовал через набор записей выполнить изменение. хотя, почитав описание, ожидаю тот же самый результат
ВнешнийИсточникДанныхТаблицаНаборЗаписей.<Имя внешнего источника>.<Имя таблицы внешнего источника данных> (ExternalDataSourceTableRecordSet.<External source name>.<External data source table name>)
Записать (Write)
Доступен, начиная с версии 8.3.5.
Синтаксис:
Записать(<Замещать>)
Параметры:
<Замещать> (необязательный)
Тип: Булево.
Определяет режим замещения существующей записи в соответствии с текущими установками отбора. Истина — перед записью существующие записи будут удалены. Ложь — записи будут дописаны к уже существующим в информационной базе записям.
Значение по умолчанию: Истина.
Описание:
Выполняет запись набора записей в базу данных внешнего источника данных. В зависимости от переданного параметра может быть выполнено добавление записей или замещение. Если указано замещение, то перед выполнением записи будет выполнено удаление всех существующих записей в соответствии с текущими установками отбора.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.5.
Когда параметр identity insert имеет значение off
I am experimenting with the code here:
I can’t do the insert because I’m getting this error message: ‘Cannot insert explicit value for identity column in table Shippers when IDENTITY_INSERT is set to OFF’. (I changed the SQL a bit; that’s not the problem). So I go to my Northwind DB and run this tiny script:
— SET IDENTITY_INSERT to ON.
SET IDENTITY_INSERT Shippers ON
Then I get another error message: ‘ Msg 1088, Level 16, State 11, Line 2
Cannot find the object "Shippers" because it does not exist or you do not have permissions. ’
What is going on here? I most certainly have permissions to do whatever I want with this DB!!