如何在 SQL Server 中禁用数据库中的所有 CHECK 和外键约束(T-SQL 示例)
可以使用下面的代码禁用 SQL Server 中当前数据库的所有 CHECK 和外键约束。
EXEC sp_MSforeachtable @command1=“ALTER TABLE ? NOCHECK CONSTRAINT ALL”
这使用 Microsoft 未记录的存储过程。此过程允许您对数据库中的每个表执行任务。因此,它非常适合我们在这里的任务 - 禁用当前数据库中的所有约束。sp_MSforeachtable``CHECK
下面是一个我执行此操作然后检查结果的示例。
示例 1 – 查看约束
首先,我将快速查看数据库中的当前键约束和外键约束,以查看它们是启用还是禁用。CHECK
SELECT OBJECT_NAME(parent_object_id) AS ‘Table’, name AS ‘Constraint’, is_disabled, is_not_trusted FROM sys.foreign_keys UNION SELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trusted FROM sys.check_constraints;
输出:
+----------------+-----------------+---------------+------------------+
| Table | Constraint | is_disabled | is_not_trusted |
|----------------+-----------------+---------------+------------------|
| ConstraintTest | chkPrice | 0 | 0 |
| ConstraintTest | chkValidEndDate | 0 | 0 |
| ConstraintTest | chkTeamSize | 0 | 0 |
| Occupation | chkJobTitle | 0 | 0 |
+----------------+-----------------+---------------+------------------+因此,对于两个不同的表,数据库中目前有四个约束。CHECK
我们可以看到所有约束都已启用,因为设置为 .is_disabled0
示例 2 – 禁用约束
现在我将禁用所有约束:
EXEC sp_MSforeachtable @command1=“ALTER TABLE ? NOCHECK CONSTRAINT ALL”
在执行此类操作时,确保使用正确的数据库通常是一个好主意。因此,我们可以通过显式切换到正确的数据库来添加到上面的代码中:
USE Test; EXEC sp_MSforeachtable @command1=“ALTER TABLE ? NOCHECK CONSTRAINT ALL”
在这个示例中,我切换到一个名为 的数据库。Test
示例 3 – 检查结果
运行上述代码后,现在我将运行第一个示例中的相同查询以查看结果。
SELECT OBJECT_NAME(parent_object_id) AS ‘Table’, name AS ‘Constraint’, is_disabled, is_not_trusted FROM sys.foreign_keys UNION SELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trusted FROM sys.check_constraints;
输出:
+----------------+-----------------+---------------+------------------+
| Table | Constraint | is_disabled | is_not_trusted |
|----------------+-----------------+---------------+------------------|
| ConstraintTest | chkPrice | 1 | 1 |
| ConstraintTest | chkValidEndDate | 1 | 1 |
| ConstraintTest | chkTeamSize | 1 | 1 |
| Occupation | chkJobTitle | 1 | 1 |
+----------------+-----------------+---------------+------------------+因此,数据库中的所有约束都已禁用(因为该列设置为这些约束)。is_disabled1
请注意,该列也设置为 。这是一个重要的注意事项,尤其是在打算重新启用任何禁用约束时。is_not_trusted1
有关如何在重新启用约束时恢复信任的信息,请参阅在 SQL Server 中启用 CHECK 约束时应了解的有关 WITH NOCHECK 的信息。该文章中的信息也适用于外键。
单独禁用约束
如果只想逐个禁用约束,请参阅如何在 SQL Server 中禁用 CHECK 约束以获取示例。