SqlBulkInsert - ¿Cómo configurar disparadores de incendio, verificar restricciones?

ado.net sqlbulkcopy sql-server-2005

Pregunta

Estoy realizando una inserción masiva con un objeto ADO.NET 2.0 SqlBulkCopy desde un método C # a una base de datos MS SQL 2005, usando un usuario de base de datos con permisos limitados. Cuando intento ejecutar la operación, aparece el mensaje de error:

Copia masiva fallada El usuario no tiene el permiso ALTER TABLE en la tabla 'theTable'. El permiso ALTER TABLE se requiere en la tabla de destino de una operación de copia masiva si la tabla tiene desencadenantes o restricciones de verificación, pero 'FIRE_TRIGGERS' o 'CHECK_CONSTRAINTS' no se especifican como opciones para el comando de copia masiva.

Leí algo de documentación y creé el objeto de copia masiva con el constructor que me permite especificar tales cosas:

    SqlBulkCopy bc = new SqlBulkCopy(
        System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"],
        SqlBulkCopyOptions.FireTriggers & SqlBulkCopyOptions.CheckConstraints);

Pero esto no cambia nada. Recibo el mismo mensaje de error que antes. Intenté jugar con algunos de los otros valores de SqlBulkCopyOptions, pero no tuve suerte. Realmente pensé que esto solucionaría el problema, ¿me estoy perdiendo algo?

Probé el procedimiento después de otorgar ALTER en la tabla a mi usuario y la operación se realizó correctamente. Sin embargo, esta no es una opción para mi situación.

Respuesta aceptada

¡Resuelto! Parece que necesito un repaso en las banderas enumeradas. Fui a nivel de bit y a los valores de enumeración cuando debería haberlos OReado.

SqlBulkCopyOptions.FireTriggers & SqlBulkCopyOptions.CheckConstraints

evalúa a cero (que es equivalente a SqlBulkCopyOptions.Default).

SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints

Funcionó correctamente y permitió que se completara el inserto a granel.


Respuesta popular

Sólo posibilidades, lo siento

La documentación de SQL para BULK INSERT especifica 3 casos en los que se necesita ALTER TABLE. Has enumerado 2 de ellos. ¿Se está configurando la opción KeepIdentity, incluso si no es necesaria?

Otra opción es que el desencadenante en la tabla ya está deshabilitado, lo que confunde el problema. Use ALTER TABLE dbo.SomeTable ENABLE TRIGGER ALL para asegurarse de que ALTER TABLE dbo.SomeTable ENABLE TRIGGER ALL habilitado.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué