tipos - ¿SQL Server permite infracciones de restricción en una transacción siempre y cuando aún no esté confirmada?
restricción de tipo check (3)
No lo siento. SQL Server no permite restricciones diferidas en una transacción. Estaba presente en SQL Server 6.5, pero se eliminó en SQL Server 2000:
SET DISABLE_DEF_CNST_CHK ON
Cada declaración individual debe ser coherente, etc., independientemente de si se trata de una transacción.
Algunos RDBMS permiten esto (por ejemplo, Oracle, Postgres, Interbase)
Conectar
Hay una solicitud de Microsoft Connect , creada en 2006, que solicita esta función:
Opción de diferir la verificación de la restricción de la clave externa hasta la confirmación de la transacción
Hay varios escenarios de "gallina y huevo" en los que sería conveniente aplazar la verificación de las restricciones de integridad referencial hasta el momento de comprometerse en una transacción.
Permitir el aplazamiento de la verificación de la restricción de integridad referencial hasta el tiempo de confirmación en una transacción (como opción). Sugiera proporcionar una opción en BEGIN TRANSACTION que especifique esto.
La última respuesta de Microsoft llegó hace una década:
Publicado por Sameer [MSFT] el 13/10/2006 a las 1:35 PM
Hola Greg,
Gracias por la respuesta. Somos conscientes de esto y lo buscamos para un futuro lanzamiento.
Sameer Verkhedkar
Motor SQL
[MSFT]
Que es Microsoft habla por "vete" .
SQL-92 lo define
La característica fue definida en julio de 1992 con SQL-92 . Una sintaxis de ejemplo sería:
BEGIN TRANSACTION
SET CONSTRAINTS ALL DEFERRED --applies only to the current transaction
INSERT Customers ...
INSERT Orders ...
UPDATE Customers ... --add the thing we were missing
COMMIT TRANSACTION
¿SQL Server permite infracciones de restricción (es decir, restricciones diferidas) en una transacción siempre que la transacción aún no se haya confirmado?
Tengo una transacción en ejecución, no comprometida y mientras esta transacción se está ejecutando, cambiaré mis datos para que viole algunas restricciones (por ejemplo, tener claves primarias duplicadas) Cuando confirme la transacción, los datos estarán en un estado consistente y válido. ¿Está esto generalmente permitido en SQL y específicamente en MS SQL Server?
Puede desactivar sus restricciones mientras ejecuta su transacción, y luego volver a habilitarlas cuando haya terminado.
ALTER TABLE mytable NOCHECK CONSTRAINT myconstraint
--... RUN TRANSACTION
ALTER TABLE mytable WITH CHECK CHECK CONTRAINT ALL
Advertencia : Esto afectará a todas las conexiones.
Si debe (como un Proceso para limpiar datos de un archivo de importación), luego coloque los datos intermedios en tablas temporales o variables de tablas o tablas de preparación y luego solo realice las acciones en las tablas reales con las restricciones después de haberlas limpiado y hizo los datos correctos.