首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哪些是不可信的限制因素,需要采取哪些行动加以纠正?

哪些是不可信的限制因素,需要采取哪些行动加以纠正?
EN

Database Administration用户
提问于 2022-04-13 13:07:31
回答 4查看 119关注 0票数 0

链接:https://learn.microsoft.com/en-us/sql/dma/dma-bestpractices?view=sql-server-ver15

在迁移数据之前,检查源数据库和目标数据库上的不可信约束。

什么是不可信的约束?检查不可信约束意味着什么?具体检查要采取什么和什么行动?

EN

回答 4

Database Administration用户

发布于 2022-04-13 13:10:47

使用NOCHECK创建或更新的外键。基本上,表中的数据没有被验证,因此无法知道数据是否符合约束。这里有更多关于它的信息

票数 1
EN

Database Administration用户

发布于 2022-04-13 13:14:20

假设您有一个CHECK约束,该约束指定表中的“年龄”列必须介于0到130之间。

现在,假设您禁用了该约束:

代码语言:javascript
复制
ALTER TABLE myTable NOCHECK CONSTRAINT myconstraint

您现在有一个禁用的约束。假设您稍后重新启用了该约束:

代码语言:javascript
复制
ALTER TABLE myTable CHECK CONSTRAINT myconstraint

现在启用了该约束,但是您可以在该约束被禁用时在其中添加数据。也就是说,约束是不可信的。例如,优化器不能依赖该约束进行优化。但是,如果您像下面这样启用了它,那么它就不会不受信任:

代码语言:javascript
复制
ALTER TABLE myTable WITH CHECK CHECK myconstraint

可能不受信任的两种约束类型是CHECKFOREIGN KEY约束。

票数 1
EN

Database Administration用户

发布于 2022-04-14 13:02:49

正如其他人所提到的,这是指具有选项WITH NOCHECK集的约束。这适用于外键约束和检查约束。

您可以使用此查询找到它们。

代码语言:javascript
复制
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

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/310916

复制
相关文章

相似问题

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