Es el caso de que IDENTITY_INSERT solo se puede establecer en ON en una tabla de base de datos a la vez, pero ¿por qué? Dado que las IDENTITY
columnas no son globalmente únicas, no puedo pensar en una situación peligrosa que pueda ser causada al insertar identidades en más de una tabla al mismo tiempo (al menos no más peligroso que generalmente falsificar con IDENTITY INSERT).
IDENTITY INSERT rara vez se debe utilizar, pero ¿cuál es la razón del límite estricto?
sql-server
Ben Brocka
fuente
fuente
Respuestas:
Creo que es para hacerlo difícil. Si pudieras dejarlo encendido todo el tiempo, ¿por qué incluso tener un campo de identidad?
Sin embargo, en realidad hay un par de restricciones:
Según las restricciones relacionadas con la conexión, creo que es principalmente así que nunca se deja ENCENDIDO accidentalmente.
Imagínese si alguien activa la inserción de ID en una de sus tablas, ¿entonces no se dio cuenta y se realizó una inserción (normalmente) no válida que rompió la integridad de su campo de ID?
Tenga en cuenta que los campos de ID pueden tener valores duplicados si no hay una restricción o un índice único en su lugar ...
fuente
IDENTITY
también se convierte en una restricción única. Muy fácil de refutar, por supuesto, si lo intentan.Supongo que fue una restricción debido a la implementación. Permitir esta configuración en varias tablas fue un éxito potencial:
Dado que este es un parámetro de sesión, permitir que la configuración se active en una sola tabla significa que es un indicador simple y la identificación del objeto de la tabla para almacenar en la sesión, del lado del servidor. Tal vez esto sea solo un número entero: 0 si no hay IDENTITY_INSERT activo, y alguna codificación de databaseid + objectid para la tabla.
Permitir que el parámetro se establezca en varias tablas dentro de una sesión significaría que el servidor almacenaría una lista dinámica de dichos objetos y la verificaría para cada instrucción de inserción. Imagine que una sesión activa el parámetro para mil tablas:
También sospecho que set identity_insert on tiene un impacto de rendimiento amplio en el servidor. En Sybase había un " factor de configuración de grabación de identidad ", que permitía guardar el valor del contador de identidad de una tabla para guardarlo solo de vez en cuando (el valor se guarda en la memoria y se escribe en el disco de vez en cuando y en el servidor apagar ). SQL Server se basa en el mismo código, por lo que probablemente tenga una optimización comparable, pero la activación de identity_insert en una tabla probablemente restringe al servidor a guardar el valor de identidad para cada inserción, porque de lo contrario no puede garantizar un tamaño de espacio máximo. Entonces, si una sesión produce un impacto en el rendimiento de las inserciones en una tabla, esto probablemente sea aceptable, pero no si puede hacer que el rendimiento se vea afectado en todas las tablas de aumento automático en el servidor.
fuente
INSERT
puede estar sucediendo uno a la vez para una sesión, y podría insertar fácilmente 10 millones deIDENTITY
valores codificados .SET IDENTITY_INSERT
está habilitado? Solo estoy sugiriendo que el tamaño de la brecha no afecta a varias tablas de manera diferente de lo que afecta a una sola tabla.