2010-04-29 28 views
6

Tengo algunas tablas donde se agregan restricciones de clave externa. Estos se utilizan con generación de código para configurar uniones específicas en procedimientos almacenados generados.Servidor SQL: eliminación de filas con restricciones de clave externa: ¿Pueden las transacciones anular las restricciones?

¿Es posible anular estas restricciones llamando a varias eliminaciones dentro de una transacción, específicamente "TransactionScope" en C# o se elimina en cascada obligatoriamente?

Respuesta

13

No utilice la eliminación de cascada, puede causar serios problemas de rendimiento de esa manera. El mejor procedimiento es hacer las eliminaciones en orden desde la tabla secundaria más baja hasta la tabla padre.

Desactivar las claves externas es una prescripción para tener problemas de integridad de datos. La única vez que se debe hacer algo así es con un DBA que tenga mucha experiencia y esté al tanto de los problemas que podrían causar. Si está haciendo esta pregunta, aún no tiene la experiencia suficiente para usar esa técnica. Recuerde que cuando deshabilita el FK, lo desactiva para todos, no solo para su proceso.

+0

OP dice: '... Se añaden restricciones de clave externa. Se usan con generación de código para configurar uniones específicas en procedimientos almacenados generados. –

+0

@HLGEM : Estoy de acuerdo en que en esta situación (descrita en uno de mis comentarios sobre otra respuesta) borrar caritativamente en el orden del niño más bajo es probablemente la mejor opción. –

+5

No estoy de acuerdo con que las eliminaciones en cascada causen un problema de rendimiento. De hecho, son la solución más eficiente posible (mire el plan de ejecución). Si lo hace manualmente, debe realizar la misma cantidad de trabajo pero más ineficiente – usr

2

No puede anular las restricciones FK, si pudiera, ¿cuál sería el sentido de crearlas en primer lugar?

+1

cierto, lo que quiero decir es, supongo: es que la restricción de clave foránea/referencias no se validaría/verificaría en las filas hasta el final de la transacción, por lo que las eliminaciones en cascada no necesitarían realizarse. –

+2

No lo creo; incluso dentro de una transacción se aplica la integridad relacional. Puede desactivar los FK como señala OMG. –

+1

Eso es una pena que la integridad no se compruebe al final de una transacción (o habilitado/configurado para hacerlo), sería de ayuda. –

7

La única manera de "anular" un foreign key constraint es deshabilitarlo:

Desactivación de una restricción FOREIGN KEY permite que los datos de la tabla para ser modificado sin ser validado por las restricciones. Deshabilite una restricción FOREIGN KEY durante las instrucciones INSERT y UPDATE si los datos nuevos violarán la restricción o si la restricción se aplicará solo a los datos que ya están en la base de datos.

Es necesario utilizar el comando ALTER TABLE desactivar una restricción, usando la palabra clave NOCHECK. IE:

ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap; 

La única otra alternativa es soltar la restricción y volver a agregarla cuando sea necesario.

La necesidad de hacer esto debería llevar a discusiones sobre cómo modelar las tablas para que esto no sea necesario.

+1

+1, exactamente lo que estaba pensando, si el FK existe solo para una utilidad de código gen para hacer algunos procedimientos almacenados, entonces soltarlos no sería realmente un problema. –

+0

KM: Codificamos mucho, generalmente eliminamos las restricciones para las bases de datos de producción y raramente borramos cualquier registro. Entonces las restricciones usualmente no son un problema. En nuestro nuevo modelo Multi-Tenancy pensamos en mantenerlos, pero eliminar un Inquilino completo, que es obligatorio, nos da este problema de Clave Extranjera. Preferiría no deshabilitar/habilitar o eliminar/crear las restricciones. Supongo que podríamos eliminar el orden de las eliminaciones (que parecen ser una opción obvia, o simplemente no podemos usar las restricciones como mencionas. –

+0

@ Mark Redman: La integridad de los datos es muy cuestionable si no hay restricciones establecidas. –

1

Si sus limitaciones FK se establecen específicamente para su uso específico en los procedimientos almacenados, estos no no son realmente FK, ¿verdad? una buena solución sería actualizar el código correspondiente creando las restricciones al comienzo del proceso y borrándolas cuando se haya completado el código. No olvide tratar el caso en el que su restricción temporal no se puede comparar con los datos.

+0

Se usan para configurar algunas combinaciones en la generación de código (selecciona etc.), pero funcionan como se diseñaron si se dejan las FK. –

1

Las restricciones pueden configurarse como inmediatas o diferidas hasta el final de una transacción. Retrasar hasta el final de una transacción le permite violar las restricciones mientras construye la transacción, pero aplicarlas al final de la transacción. Por lo que entiendo, demorar hasta el final de una transacción es lo que probablemente busques.

Cuestiones relacionadas