2009-08-25 10 views
5

Recientemente leí en Fowler's PofEA que algunos motores de base de datos le permiten diferir los controles de IR hasta el final de la transacción. ¿Es esto posible en SQL Server?¿Es posible posponer las comprobaciones de integridad referencial hasta el final de una transacción en SQL Server?

El problema viene con algunos escenarios en los que intento guardar cambios que incluyen inserciones y eliminaciones, puede ser difícil determinar el orden correcto en el que realizar las operaciones para evitar fallas de RI. Sé que al final de la transacción, el RI será bueno, por lo que sería ideal aplazar estos controles.

+0

Se podría hacer que suceda por activar/desactivar las restricciones en el inicio y final de un sproc, pero esa es una ruta tan aterradora que realmente cuestionaría la aplicación o el modelo de datos. –

Respuesta

3

Parece que el servidor sql no permite esto, pero usted aren't the only one que lo quiere. Es parte del estándar SQL 92, por lo que han tenido 17 años para resolverlo. Por otra parte, MySQL tampoco lo admite (aunque Oracle sí).

Reordenar las declaraciones es probablemente su mejor opción.

+1

Ugh. Hay cosas mucho más útiles que deberían implementar que eso. Paquetes, sintaxis real para consultas jerárquicas ... –

+0

Gracias por el enlace. Me alegra saber que no soy el único que piensa que esto sería útil. –

2

Será mejor que determine el orden correcto para que la transacción pueda fallar en el momento apropiado. Esto debería ser una determinación de una sola vez.

+1

El punto es que la transacción no debería fallar. La verificación de RI que está fallando será irrelevante para el final de la transacción porque las filas relacionadas se eliminarán. También es una pérdida de tiempo hacer el cheque. –

+1

No debería, pero * puede *. Si bien esta característica puede estar presente en otros RDBMS, me parece muy "maloliente". No debería ser tan difícil determinar el orden de ejecución correcto. –

+1

Bueno, puede parecer mal, pero Martin Fowler cree que es útil y el estándar ANSI SQL-92 dice que así es como debería funcionar, así que eso es suficiente para mí :-) –

2

SQL Server no tiene esta función.

Puedo sugerir humildemente que si es difícil determinar el orden de inserción correcto (o no hay uno), que el diseño de su base de datos puede necesitar ser refactorizado o al menos examinado con mucho cuidado.

+1

+1: De hecho, suena como una problema de diseño. –

+0

No es que no sepa el orden de las inserciones, pero estoy usando un ORM básico que INSERTAR o ELIMINAR según el estado de los objetos. Si tengo un código que dice A.Save(); B.Save(); C.Save(); y esos guardados hacen INSERT entonces todo está bien. Sin embargo, si esos objetos han sido eliminados, entonces realmente necesito hacer C.Save(); B.Save(); A.Save(); –

2

Si usted está en SQL Server 2008, puede utilizar MERGE combinar insertar/eliminar una transacción segura RI-sola ...

Cuestiones relacionadas