SqlBulkInsert - Как установить триггеры огня, проверить ограничения? - PullRequest
14 голосов
/ 17 декабря 2008

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

Массовое копирование не удалось. Пользователь не имеет Разрешение ALTER TABLE для таблицы 'стол'. ALTER ТАБЛИЦА требуется разрешение на таблица назначения операции массового копирования если в таблице есть триггеры или проверка ограничения, но 'FIRE_TRIGGERS' или 'CHECK_CONSTRAINTS' Навальные подсказки не указывается в качестве параметров для массовой копии команда.

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

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

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

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

Ответы [ 2 ]

24 голосов
/ 17 декабря 2008

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

SqlBulkCopyOptions.FireTriggers & SqlBulkCopyOptions.CheckConstraints

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

SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints

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

2 голосов
/ 17 декабря 2008

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

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

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

...