Подтвердить что ты не робот

SqlBulkInsert - Как установить Fire Triggers, Проверить ограничения?

Я выполняю массовую вставку с объектом ADO.NET 2.0 SqlBulkCopy из метода С# в базу данных MS SQL 2005, используя пользователя базы данных с ограниченными разрешениями. Когда я пытаюсь запустить операцию, я получаю сообщение об ошибке:

Ошибка массовой копии. Пользователь не имеет Разрешение ALTER TABLE на таблицу 'стол'. ALTER Разрешение TABLE требуется на целевая таблица операции массовой копии если в таблице есть триггеры или проверка ограничений, но 'FIRE_TRIGGERS' или 'CHECK_CONSTRAINTS' объемные подсказки не указанные в качестве опций для массовой копии команда.

Я прочитал некоторую документацию и создал массивный экземпляр объекта с конструктором, который позволяет мне указать такие вещи:

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

Но это ничего не меняет - я получаю такое же сообщение об ошибке, что и раньше. Я пытался возиться с некоторыми другими значениями SqlBulkCopyOptions, но не повезло. Я действительно думал, что это исправит проблему, я что-то упустил?

Я протестировал процедуру после предоставления ALTER в таблице моему пользователю, и операция прошла успешно. Однако это не вариант для моей ситуации.

4b9b3361

Ответ 1

Решил! Похоже, мне нужно обновить флажки. Я побитовал ANDing значения enum, когда я должен был их ORing.

SqlBulkCopyOptions.FireTriggers & SqlBulkCopyOptions.CheckConstraints

оценивается до нуля (что эквивалентно SqlBulkCopyOptions.Default.)

SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints

Правильно работает и разрешено заполнять объемную вставку.

Ответ 2

Только возможности, извините

Документация SQL для BULK INSERT указывает 3 случая, когда требуется ALTER TABLE. Вы указали 2 из них. Установлен ли параметр KeepIdentity, даже если он не нужен?

Другим вариантом является то, что триггер в таблице уже отключен, запутав проблему. Используйте ALTER TABLE dbo.SomeTable ENABLE TRIGGER ALL для обеспечения включенности.