SqlBulkCopy如何环绕外键约束?

Ian*_*ton 23 sql-server foreign-keys sqlbulkcopy

我使用SqlBulkCopy将一组行插入到表中.我忘了在行上设置一个整数值.缺少的列用于引用另一个表,并使用外键约束强制执行此操作.

对于插入的每一行,最终整数值为零,零不识别相关表中的行.当我将值修改为有效值然后尝试将其切换回零时,它将不接受它.

所以我的问题是SqlBulkCopy如何设法让数据库处于无效状态?

usr*_*usr 26

SqlBulkCopy如何设置让数据库处于无效状态?

它会禁用您要插入的表上的外键.

是的,这是一个可怕的默认值.如果您能负担得起,请务必设置选项CHECK_CONSTRAINTS(或CheckConstraints用于SqlBulkCopy).

它默认情况下也不触发同样可怕的数据一致性触发器.触发器是有原因的.

  • 好的,对.FK有两个独立的禁用状态:禁用和不信任.两者都在元数据视图中可见.不信任意味着可能存在无效行,并且引擎不使用FK的属性进行查询优化.您可能会对SqlBulkCopy发送的语句感兴趣.运行SQL事件探查器. (3认同)

小智 6

默认情况下,批量复制操作期间将忽略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

希望这可以帮助.