Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como listar todas as chaves estrangeiras com WITH NOCHECK no SQL Server


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.)