链接:https://learn.microsoft.com/en-us/sql/dma/dma-bestpractices?view=sql-server-ver15
在迁移数据之前,检查源数据库和目标数据库上的不可信约束。
什么是不可信的约束?检查不可信约束意味着什么?具体检查要采取什么和什么行动?
发布于 2022-04-13 13:10:47
使用NOCHECK创建或更新的外键。基本上,表中的数据没有被验证,因此无法知道数据是否符合约束。这里有更多关于它的信息。
发布于 2022-04-13 13:14:20
假设您有一个CHECK约束,该约束指定表中的“年龄”列必须介于0到130之间。
现在,假设您禁用了该约束:
ALTER TABLE myTable NOCHECK CONSTRAINT myconstraint您现在有一个禁用的约束。假设您稍后重新启用了该约束:
ALTER TABLE myTable CHECK CONSTRAINT myconstraint现在启用了该约束,但是您可以在该约束被禁用时在其中添加数据。也就是说,约束是不可信的。例如,优化器不能依赖该约束进行优化。但是,如果您像下面这样启用了它,那么它就不会不受信任:
ALTER TABLE myTable WITH CHECK CHECK myconstraint可能不受信任的两种约束类型是CHECK和FOREIGN KEY约束。
发布于 2022-04-14 13:02:49
正如其他人所提到的,这是指具有选项WITH NOCHECK集的约束。这适用于外键约束和检查约束。
您可以使用此查询找到它们。
SELECT
s.name schema_name,
t.name table_name,
k.name constraint_name
FROM (
SELECT
name,
parent_object_id
FROM sys.check_constraints
WHERE is_not_trusted = 1
UNION ALL
SELECT
name,
parent_object_id
FROM sys.foreign_keys
WHERE is_not_trusted = 1
) k
JOIN sys.tables t ON t.object_id = k.parent_object_id
JOIN sys.schemas S ON s.schema_id = t.schema_id;可以使用此脚本自动将所有约束设置为WITH CHECK。
DECLARE @sql nvarchar(max) =
(
SELECT
STRING_AGG(CAST('ALTER TABLE ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ' WITH CHECK CHECK CONSTRAINT ALL;' AS nvarchar(max)), '
' )
FROM (
SELECT
parent_object_id
FROM sys.check_constraints
WHERE is_not_trusted = 1
UNION -- do use not ALL
SELECT
parent_object_id
FROM sys.foreign_keys
WHERE is_not_trusted = 1
) k
JOIN sys.tables t ON t.object_id = k.parent_object_id
JOIN sys.schemas S ON s.schema_id = t.schema_id;
EXEC sp_executesql @sql;https://dba.stackexchange.com/questions/310916
复制相似问题