sql server - relaciones - ¿Cómo circunvala SqlBulkCopy las restricciones de clave externa?
restricción foreign key sql server (2)
¿Cómo logra SqlBulkCopy dejar la base de datos en un estado no válido?
Desactiva las claves externas en la tabla en la que está insertando.
Sí, este es un defecto horrible. Asegúrese de establecer la opción CHECK_CONSTRAINTS
(o CheckConstraints
para SqlBulkCopy
) si puede permitírselo.
También, por defecto, no dispara disparadores, lo que es igualmente terrible para la consistencia de los datos. Los desencadenantes están ahí por una razón.
Utilicé SqlBulkCopy para insertar una colección de filas en una tabla. Olvidé establecer un valor entero en las filas. La columna que falta se usa para hacer referencia a otra tabla y esto se aplica con una restricción de clave externa.
Para cada fila insertada, el valor entero final fue cero y cero no identificó una fila en la tabla relacionada. Cuando modifiqué el valor a un valor válido y luego intenté volver a ponerlo en cero, no lo aceptaría.
Entonces, mi pregunta es ¿cómo logra SqlBulkCopy dejar la base de datos en un estado no válido?
Por defecto, las restricciones CHECK y FOREIGN KEY se ignoran durante la operación de copia masiva. SqlBulkCopy es una clase administrada que proporciona una funcionalidad similar a la que ofrece el comando bcp de SQL Server. El comando bcp tiene una sugerencia -h y, a menos que proporcione la sugerencia CHECK_CONSTRAINTS, las restricciones CHECK y FOREIGN KEY se ignoran durante la carga masiva. El artículo de Technet establece que: http://technet.microsoft.com/en-us/library/ms162802.aspx
De manera similar, la clase SqlBulkCopy tiene un constructor que acepta enumeración SqlBulkCopyOptions. Tendría que configurar la opción de enumeración CheckConstraints para asegurarse de que las restricciones estén verificadas: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopyoptions(v=vs.110).aspx
Aquí hay un artículo que habla sobre el control de verificación de restricciones - http://technet.microsoft.com/en-us/library/ms186247(v=sql.105).aspx
Espero que esto ayude.