运行EXEC sp_msforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
将禁用现有表上的外键。
如果执行此查询后执行外键约束的表和插入数据查询运行怎么办?
我在构建自动化期间遇到了这个问题,我理想的是一个永久性的开关来禁用数据库上的所有约束(我可以这样做,因为数据库是作为构建过程的一部分创建的)。
注意:请参阅最后提到的5个步骤,以了解构建自动化过程中遇到的问题
我在处理脚本之前创建了一个构建步骤,以禁用所有现有的外键约束。下一步是打包并运行所有发布的sql脚本,这些脚本可能包含已创建的表,已插入数据。早期的禁用约束的构建步骤没有关于即将到来的数据库表和插入脚本的线索,这些脚本将在运行数据插入后强制执行外键约束,从而使构建过程失败。
有没有办法在数据库中设置一个标志来停止检查外键?
为我正在做的事情添加一些更多的背景。使用竹子进行自动构建并在高级别上执行以下步骤
找到上次可用的已部署数据库架构
使用架构生成的脚本构建数据库(未复制主数据)。
禁用所有外键(无法为尚未在下一步中创建的表格禁用FK )
合并所有特定于发行版的db脚本(可能包含新的db和插入脚本)
应用其他转换,例如运行代码生成,脚本比较,增量查找等。
第3步是挑战。
注意:这是自动化具有300个主数据和数据的遗留系统,因为使用了Codesmith工具,必须检测模式更改,并且必须针对上次部署的模式检查自动生成的代码。由于主数据非常庞大,因此保留带有数据的参考数据库用于构建目的是不可能的,因此引用完整性约束问题将更加突出。
答案 0 :(得分:1)
我唯一能想到的是创建一个监听约束的DDL触发器。创建,如果有任何检测到,则丢弃它们。但是,如果将约束作为create table
语句的一部分创建,我不确定这种方法是否可行。你应该在使用之前彻底测试它。
然而,就我个人而言,我通常通过正确排序插入数据的顺序来解决这个问题。它更加安全,并非过分困难,最后但并非最不重要的是,总是可以做到。
答案 1 :(得分:0)
您的基本问题是创建数据库的数据库迁移运行顺序错误。调整表和数据插入的顺序,以便一次只插入引用现有数据的数据
关闭所有约束,加载数据,并在每个执行数据库数据更改的脚本的开头和结尾重新打开它们也是一个选项,但是您应该将执行模式更改的脚本与脚本分开进行数据加载并首先运行所有模式更改