在具有2012兼容模式下数据库的SQL 2014版服务器(12.0.2430.0-尚无SP1)中(正在努力将其切换到2014 ...),我有少数几个外键对象,这些外键对象not trusted
在数据库中始终标记为。我删除并重新创建了没有NOCHECK
选项的它们,但是在5到10分钟内,它们再次变得不受信任,如果我生成CREATE
脚本,它将显示为:
ALTER TABLE [dbo].[Points] WITH NOCHECK
ADD CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId])
REFERENCES [dbo].[Badge] ([Id])
GO
使用的创建脚本为:
ALTER TABLE [dbo].[Points]
ADD CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId])
REFERENCES [dbo].[Badge] ([Id])
GO
ALTER TABLE [dbo].[Points] CHECK CONSTRAINT [FK_BadgeId]
GO
没有复制,没有第三方工具,而且我正在监视数据库中的所有DDL语句,因此它不是另一个用户。
我能够很好地检查约束(WITH CHECK CHECK
在每个约束上使用),但是不久之后它们仍然变得不受信任。只有运行的维护工作是Ola在AM的早期工作,并且整天都在进行。
更新:
因此,在经过几次跟踪以缩小可能性后,似乎BULK INSERT
可能导致FK
变得不可信。这个msdn问题指出,这是密钥变得不受信任的有效途径,这是我第一次听说。
所以我现在的问题是,有没有一种替代方法BULK INSERT
可以保持外键is_trusted
状态?它是在每小时运行几次的应用程序的上下文中执行的。我可以让开发人员批处理其插入语句,但是BULK INSERT
如果不需要的话,我不希望在使用时使用最后通atum 。
SqlBulkCopy
的效果相同,但是(至少现在)有一个选项可以在仍然检查约束的同时进行大容量复制-这意味着大容量复制功能可以进行主体检查,很可能bcp有一些启用选项那。凡是将非检查模式设为默认模式的人都需要在脸上打孔。