首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在SQL数据库上永久关闭外键约束?

如何在SQL数据库上永久关闭外键约束?
EN

Stack Overflow用户
提问于 2017-08-04 02:10:09
回答 2查看 697关注 0票数 0

运行EXEC sp_msforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"将禁用现有表上的外键。

如果执行外键约束的表和插入数据查询在此查询之后运行,怎么办?

在构建自动化过程中,我遇到了这个问题,理想情况下,我需要的是一个永久的开关来禁用数据库上的所有约束(因为数据库是作为构建过程的一部分创建的)。

注意:请参阅前面提到的5个步骤,以了解构建自动化过程中面临的问题。

在处理脚本以禁用所有现有外键约束之前,我已经创建了一个构建步骤。下一步是打包并运行所有发行版sql脚本,这些脚本可能包含创建的表、插入的数据。前面用于禁用约束的构建步骤不了解即将出现的数据库表和插入脚本,这些脚本将在运行数据插入后强制执行外键约束,但我的构建过程失败了。

是否有办法在数据库中设置一个标志来停止检查外键?

在我所做的工作中添加一些更多的上下文,使用竹构建specifically.Automating,下面的步骤将在高级别上执行

  1. 找到最后可用的部署的db架构
  2. 使用架构生成的脚本(没有复制主数据)构建数据库。
  3. 禁用所有外键(下一步中尚未创建的表不能禁用FK )
  4. 合并所有特定于发行版的db脚本(可能包含新的db和插入脚本)
  5. 应用其他转换,如运行协变性、脚本比较、增量查找等。

第3步是挑战.

注意:这是在自动化带有300ish主数据库和数据的遗留系统,因为使用了Codesmith工具,因此必须检测模式更改,并根据上次部署的模式检查自动生成的代码。由于主数据是如此庞大,将引用数据库与数据一起用于构建是不可能的,因此引用完整性约束问题将更加突出。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-04 05:49:28

我唯一能想到的就是创建一个DDL触发器,该触发器侦听约束的创建,如果检测到任何约束,则删除它们。但是,如果将约束创建为create table语句的一部分,我不确定这种方法是否可行。你应该在使用前对它进行彻底的测试。

然而,就我个人而言,我通常通过正确排序数据插入的顺序来解决这个问题。这是安全得多,不是令人望而却步的困难,最后但并非最不重要的,始终有可能做到。

票数 1
EN

Stack Overflow用户

发布于 2017-08-04 05:46:08

您的基本问题是正在创建数据库的数据库迁移正在以错误的顺序运行。调整表和数据插入的顺序,以便在任何时候只插入引用现有数据的数据。

关闭所有约束,加载数据,并在每个执行DB数据更改的脚本的开始和结束时重新打开它们,也是一个选项,但您应该将执行模式更改的脚本与加载数据的脚本分开,并首先运行所有模式更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45497232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档