Переключить вставку идентификатора с помощью одного оператора

Для особо ленивых: существует ли один оператор, который будет переключать IDENTITY INSERT sometable из состояния "включено" в положение "выключено" и наоборот?


person George Menoutis    schedule 05.09.2019    source источник
comment
Вы имеете в виду SET INSERT_IDENTITY (Transact-SQL)?   -  person Larnu    schedule 05.09.2019
comment
@Larnu Я думаю, что OP хочет команду, которая будет переключаться, а не быть ни ON, ни OFF.   -  person DavidG    schedule 05.09.2019
comment
да. Запрос состоит в том, чтобы оператор переключал текущий статус, не предоставляя его. Таким образом, запуск одного и того же оператора два раза сначала активирует его, а затем выключит.   -  person George Menoutis    schedule 05.09.2019
comment
Нет, для этого нет единой линии. Вы можете обернуть его в чек (например, this), но мне все равно все это кажется очень опасным.   -  person DavidG    schedule 05.09.2019
comment
Явно установить для него значение ON или OFF должно быть лучше по многим причинам, и это едва ли обременительно   -  person Diado    schedule 05.09.2019
comment
Я бы сказал, что любое значение, сгенерированное автоматически, не должно иметь бизнес-значения, поэтому, за исключением очень нескольких четко определенных случаев, вы вообще не должны использовать `set identity insert.   -  person Zohar Peled    schedule 05.09.2019
comment
@GeorgeMenoutis, какой настоящий запрос стоит за этим запросом? Почему кто-то должен это делать? Переключение - это то, что кто-то может решить, но это не сама проблема. Требование одного оператора еще более странное.   -  person Panagiotis Kanavos    schedule 05.09.2019
comment
Это похоже на проблему XY. Есть проблема X (возможно, массовый импорт?), и кто-то считает, что Y является решением (переключение идентичности). Когда это не работает, вопрос касается Y, а не фактической проблемы Y. В чем настоящая проблема?   -  person Panagiotis Kanavos    schedule 05.09.2019
comment
Кроме того, переключение означает, что вы никогда не не знаете, что такое настройка. Это совсем не хорошая идея, и я не могу представить, почему кто-то может хотеть быть в таком неопределенном состоянии.   -  person Panagiotis Kanavos    schedule 05.09.2019


Ответы (1)


Нет, нет инструкции toggel identity_insert, и на то есть веские причины:

Значения, автоматически генерируемые базой данных, не должны иметь никакого бизнес-значения.

Использование столбца идентификаторов в качестве суррогатного ключа может помочь упростить работу с базой данных, но приписывать бизнес-значение значениям, которые база данных генерирует для вас, неправильно — это приводит к тому, что люди задают такие вопросы, как "Как исправить пробелы в моем столбце идентификации" (мой личный любимый ответ: этот Аарон Бертран).

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

По этой причине set identity_insert следует использовать только в очень немногих ситуациях - на самом деле, кроме копирования данных из одной таблицы в другую, когда вы хотите точно сохранить исходные значения - я даже не могу думать о другой ситуации, когда set identity_insert был бы полезный.

В сочетании с тем фактом, что только одна таблица может находиться в состоянии identity_insert за сеанс, вы сможете легко понять, почему вы не хотите видеть что-то вроде toggle identity_insert, что в лучшем случае неоднозначно.

tl;dr; Учитывая ограниченное количество раз, когда следует использовать оператор set identity_insert, и его ограничения, использование оператора toggle identity_insert — действительно плохая идея.

person Zohar Peled    schedule 05.09.2019