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)
为此使用系统视图:
select * from sys.check_constraints
where is_disabled = 1;
Run Code Online (Sandbox Code Playgroud)
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)
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)