Как SqlBulkCopy обходит ограничения внешнего ключа?

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

Для каждой вставленной строки конечное целочисленное значение было равно нулю, и ноль не идентифицировал строку в связанной таблице. Когда я изменил значение на допустимое значение, а затем попытался переключить его на ноль, он не принял его.

Итак, мой вопрос: как SqlBulkCopy удается оставить базу данных в недопустимом состоянии?

2 ответа

Решение

Как SqlBulkCopy удается оставить базу данных в недопустимом состоянии?

Он отключает внешние ключи в таблице, в которую вы вставляете.

Да, это ужасный дефолт. Обязательно установите опцию CHECK_CONSTRAINTS (или же CheckConstraints за SqlBulkCopy) если ты вообще можешь себе это позволить.

Он также по умолчанию не запускает триггеры, что одинаково ужасно для согласованности данных. Триггеры существуют по причине.

По умолчанию ограничения CHECK и FOREIGN KEY игнорируются во время операции массового копирования. SqlBulkCopy - это управляемый класс, предоставляющий функциональность, аналогичную той, что предлагает команда SQL Server bcp. Команда bcp имеет подсказку -h, и если вы не укажете подсказку CHECK_CONSTRAINTS, ограничения CHECK и FOREIGN KEY игнорируются во время массовой загрузки. В статье Technet говорится, что - http://technet.microsoft.com/en-us/library/ms162802.aspx

Точно так же класс SqlBulkCopy имеет конструктор, который принимает перечисление SqlBulkCopyOptions. Вам необходимо установить опцию перечисления CheckConstraints, чтобы убедиться, что ограничения проверяются - http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopyoptions(v=vs.110).aspx

Вот статья, в которой говорится об управлении проверкой ограничений - http://technet.microsoft.com/en-us/library/ms186247(v=sql.105).aspx

Надеюсь это поможет.

Другие вопросы по тегам