怎么使用 WITH NOCHECK"列出所有外键在 SQL Server 中

本教程将介绍如何使用“WITH NOCHECK"列出所有外键在 SQL Server 中的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

怎么使用 WITH NOCHECK"列出所有外键在 SQL Server 中 教程 第1张

问题描述

有什么人知道一个查询列出了数据库中所有外键并应用了 WITH NOCHECK 描述的查询?(删除它们将提高性能和稳定性).

推荐答案

以下将返回当前数据库中被禁用的外键的名称,即 WITH NOCHECK

对于 SQL Server 2005/2008:

select * from sys.foreign_keys where is_disabled=1

关于disabled & 之间的区别的答案中有一些讨论.不信任.以下内容解释了差异这是一些代码来阐明 is_disabled 和之间的区别不受信任.

-- drop table t1
-- drop table t2
create table t1(i int not null, fk int not null)
create table t2(i int not null)
-- create primary key on t2
alter table t2
add constraint pk_1 primary key (i)
-- create foriegn key on t1
alter table t1
add constraint fk_1 foreign key (fk)
 references t2 (i)
--insert some records
insert t2 values(100)
insert t2 values(200)
insert t2 values(300)
insert t2 values(400)
insert t2 values(500)
insert t1 values(1,100)
insert t1 values(2,100)
insert t1 values(3,500)
insert t1 values(4,500)
----------------------------
-- 1. enabled and trusted
select name,is_disabled,is_not_trusted from sys.foreign_keys
GO

-- 2. disable the constraint
alter table t1 NOCHECK CONSTRAINT fk_1
select name,is_disabled,is_not_trusted from sys.foreign_keys
GO

-- 3. re-enable constraint, data isnt checked, so not trusted.
-- this means the optimizer will still have to check the column
alter table  t1 CHECK CONSTRAINT fk_1 
select name,is_disabled,is_not_trusted from sys.foreign_keys
GO

--4. drop the foreign key constraint & re-add 
-- it making sure its checked
-- constraint is then enabled and trusted
alter table t1  DROP CONSTRAINT fk_1
alter table t1 WITH CHECK 
add constraint fk_1 foreign key (fk)
 references t2 (i)
select name,is_disabled,is_not_trusted from sys.foreign_keys
GO


--5. drop the foreign key constraint & add but dont check
-- constraint is then enabled, but not trusted
alter table t1  DROP CONSTRAINT fk_1
alter table t1 WITH NOCHECK 
add constraint fk_1 foreign key (fk)
 references t2 (i)
select name,is_disabled,is_not_trusted from sys.foreign_keys
GO

is_disabled 表示约束被禁用

isnottrusted 表示 SQL Server 不相信该列已针对外键表进行了检查.

因此,不能假设重新启用外键约束会得到优化.为确保优化器信任该列,最好删除外键约束 &使用 WITH CHECK 选项重新创建它 (4.)

好了关于怎么使用“WITH NOCHECK"列出所有外键在 SQL Server 中的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。