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

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

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

Аналогично, класс SqlBulkCopy имеет конструктор, который принимает перечисление SqlBulkCopyOptions. Вам нужно будет установить опцию CheckConstraints enum, чтобы убедиться, что ограничения отмечены - 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

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