运行EXEC sp_msforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
将禁用现有表上的外键。
如果执行外键约束的表和插入数据查询在此查询之后运行,怎么办?
在构建自动化过程中,我遇到了这个问题,理想情况下,我需要的是一个永久的开关来禁用数据库上的所有约束(因为数据库是作为构建过程的一部分创建的)。
注意:请参阅前面提到的5个步骤,以了解构建自动化过程中面临的问题。
在处理脚本以禁用所有现有外键约束之前,我已经创建了一个构建步骤。下一步是打包并运行所有发行版sql脚本,这些脚本可能包含创建的表、插入的数据。前面用于禁用约束的构建步骤不了解即将出现的数据库表和插入脚本,这些脚本将在运行数据插入后强制执行外键约束,但我的构建过程失败了。
是否有办法在数据库中设置一个标志来停止检查外键?
在我所做的工作中添加一些更多的上下文,使用竹构建specifically.Automating,下面的步骤将在高级别上执行
第3步是挑战.
注意:这是在自动化带有300ish主数据库和数据的遗留系统,因为使用了Codesmith工具,因此必须检测模式更改,并根据上次部署的模式检查自动生成的代码。由于主数据是如此庞大,将引用数据库与数据一起用于构建是不可能的,因此引用完整性约束问题将更加突出。
发布于 2017-08-04 05:49:28
我唯一能想到的就是创建一个DDL触发器,该触发器侦听约束的创建,如果检测到任何约束,则删除它们。但是,如果将约束创建为create table
语句的一部分,我不确定这种方法是否可行。你应该在使用前对它进行彻底的测试。
然而,就我个人而言,我通常通过正确排序数据插入的顺序来解决这个问题。这是安全得多,不是令人望而却步的困难,最后但并非最不重要的,始终有可能做到。
发布于 2017-08-04 05:46:08
您的基本问题是正在创建数据库的数据库迁移正在以错误的顺序运行。调整表和数据插入的顺序,以便在任何时候只插入引用现有数据的数据。
关闭所有约束,加载数据,并在每个执行DB数据更改的脚本的开始和结束时重新打开它们,也是一个选项,但您应该将执行模式更改的脚本与加载数据的脚本分开,并首先运行所有模式更改。
https://stackoverflow.com/questions/45497232
复制相似问题