Сбрасывается ли identity_insert в положение OFF при закрытии сеанса?

Вопрос по SQL серверу. Хотя мои тесты говорят «да», я бы предпочел услышать это от кого-то с опытом.

Когда я использую SET IDENTITY_INSERT some_table ON, я хотел бы знать, что я могу безопасно закрыть свой сеанс, не беспокоясь о том, чтобы забыть отключить его и, таким образом, создать проблемы для другого пользователя.


person George Menoutis    schedule 08.02.2018    source источник
comment
Нечего сбрасывать. Это параметр уровня сеанса, а не параметр, прикрепленный к таблице, для которой вы разрешаете вставку идентификаторов. В документации нет ясности по этому поводу, и требование о том, что у вас есть разрешение ALTER TABLE, предполагает, что что-то в таблице изменилось, но это не так. В случае соединений в пуле (где сеанс не умирает, а сбрасывается) вопрос скорее должен заключаться в том, будет ли сброс соединения в пуле также сбрасывать IDENTITY_INSERT. Мне лень проверять это, потому что я был бы слишком удивлен, если бы ответ был отрицательным.   -  person Jeroen Mostert    schedule 08.02.2018


Ответы (2)


https://social.msdn.microsoft.com/Forums/sqlserver/en-US/1a6ba2bb-5e82-47e8-a1a0-16fc044b951e/detect-current-identityinsert-settings?forum=transactsql

От Майкрософт:

Поскольку SET IDENTITY_INSERT чувствителен к сеансу, он управляется на уровне буфера без какого-либо сохранения. Это означает, что нам не нужно проверять статус IDENTITY_INSERT, поскольку мы никогда не используем это ключевое слово в текущем сеансе.

Если есть что-то непонятное, пожалуйста, не стесняйтесь спрашивать.

Спасибо,

Джин Чен - MSFT

person Jacob H    schedule 08.02.2018

Это. Вы можете протестировать это следующим образом:

Создайте тестовую таблицу, установите вставку идентификатора и вставьте в нее.

create table Test (
  TestIdentity int identity,
  SomeValue char(1)
);

set identity_insert Test ON
insert into Test (
  TestIdentity,
  SomeValue
) values (
  1,
  'x'
)

Откройте новый запрос и попробуйте вставить в таблицу, не устанавливая вставку идентификатора. Это не удастся.

insert into Test (
  TestIdentity,
  SomeValue
) values (
  2,
  'y'
)
person Daniel Suchy    schedule 08.02.2018