O seguinte retornará o nome das chaves estrangeiras no banco de dados atual que estão desabilitadas, ou seja, COM NOCHECK
Para SQL Server 2005/2008:
select * from sys.foreign_keys where is_disabled=1
Houve alguma discussão na resposta sobre a diferença entre desabilitado e não confiável. O que está abaixo explica a diferençaAqui está algum código para esclarecer a diferença entre is_disabled e isnotrusted.
-- 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
significa que a restrição está desabilitada isnottrusted
significa que o SQL Server não confia que a coluna foi verificada em relação à tabela de chave estrangeira. Assim, não se pode presumir que a reativação da restrição de chave estrangeira será otimizada. Para garantir que o otimizador confie na coluna, é melhor descartar a restrição de chave estrangeira e recriá-la com o
WITH CHECK
opção (4.)