在 SQL Server 中禁用查找约束

Die*_*res 2 sql-server-2008 sql-server constraint alter-table ddl

我正在对 SQL Server 中的约束进行审计。

如何找到所有未启用的约束?

在使用下一个声明之后:

alter table mytable nocheck constraint all
Run Code Online (Sandbox Code Playgroud)

Mik*_*Fal 5

为此使用系统视图:

select * from sys.check_constraints
where is_disabled = 1;
Run Code Online (Sandbox Code Playgroud)


Aar*_*and 5

SELECT 
    [object] = QUOTENAME(s.name) + N'.' + QUOTENAME(t.name), 
    [disabled_constraint] = c.name
  FROM sys.tables AS t
  INNER JOIN sys.schemas AS s
  ON t.schema_id = s.schema_id
  INNER JOIN sys.check_constraints AS c
  ON t.object_id = c.parent_object_id
  WHERE c.is_disabled = 1;
Run Code Online (Sandbox Code Playgroud)


Mic*_*ell 5

Mike 和 Aaron 都走在正确的轨道上 - 但问题要求禁用所有约束 - 不仅仅是 CHECK 约束(即 FK 也可以被禁用)。

此外,FK 也可能是不可信的 - 这不仅会产生错误/无效数据的可能性,而且还会导致性能问题(因为 SQL Server 在创建执行计划时不能/不会信任这些 FK)。 : https: //sqlserverfast.com/blog/hugo/2007/03/can-you-trust-your-constraints/

因此,我倾向于使用以下内容:

    WITH constraints AS ( 
    SELECT
        QUOTENAME(SCHEMA_NAME(t.[schema_id])) + N'.' + QUOTENAME(t.[name]) [table] ,
        c.[type_desc] [constraint_type],
        c.[name] [constraint_name]
    FROM
        sys.tables AS t
        INNER JOIN sys.check_constraints AS c ON t.[object_id] = c.parent_object_id
    WHERE
        c.is_disabled = 1

    UNION 

    SELECT 
        QUOTENAME(SCHEMA_NAME([schema_id])) + N'.' + QUOTENAME(OBJECT_NAME([parent_object_id])) [table],
        CASE WHEN is_disabled = 1 THEN 'FOREIGN_KEY (DISABLED)' ELSE 'FOREIGN_KEY (UNTRUSTED)' END [constraint_type],
        [name] [constraint_name]
    FROM 
        sys.[foreign_keys] 
    WHERE 
        [is_disabled] = 1 OR [is_not_trusted] = 1
)

SELECT 
    [table],
    [constraint_type],
    [constraint_name] 
FROM 
    constraints
ORDER BY 
    [constraint_type], [table];
Run Code Online (Sandbox Code Playgroud)