Как 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
Надеюсь это поможет.