Se você se encontrar na situação em que precisa desabilitar uma restrição de chave estrangeira no SQL Server, veja como fazer isso usando o Transact-SQL.
Isso permitirá que você insira dados sem ser restringido pela chave estrangeira. Obviamente, você não faria isso a menos que tivesse uma boa razão para fazê-lo. As chaves estrangeiras reforçam a integridade referencial, portanto, desativá-las tem o potencial de criar todos os tipos de problemas.
Exemplo 1 – Desabilitar a restrição de chave estrangeira
Para desabilitar uma restrição de chave estrangeira, use o
NOCHECK
argumento dentro de um ALTER TABLE
demonstração. Assim:
ALTER TABLE BandMember NOCHECK CONSTRAINT FK_BandMember_Musician;
Este código desabilita uma restrição de chave estrangeira chamada FK_BandMember_Musician .
Exemplo 2 – Revise a restrição
Podemos consultar o
sys.foreign_keys
visão do sistema para verificar se nossa restrição foi desabilitada:SELECT name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys;
Resultado:
+--------------------------------+---------------+------------------+ | Constraint | is_disabled | is_not_trusted | |--------------------------------+---------------+------------------| | FK_BandMember_Band | 0 | 0 | | FK_BandMember_Musician | 1 | 1 | | FK_MembershipPeriod_BandMember | 0 | 0 | +--------------------------------+---------------+------------------+
Nesse caso, selecionei todas as restrições de chave estrangeira do banco de dados atual.
Podemos ver que este é o único que está desabilitado (porque seu is_disabled coluna está definida como 1 ).
Você pode notar que o is_not_trusted coluna também está definida como 1 . Isso indica que a restrição não foi verificada pelo sistema.
Isso faz sentido, porque não podemos mais supor que a restrição verificou todos os dados. O fato de a restrição estar desabilitada significa que os dados agora podem entrar no banco de dados sem serem verificados pela restrição. Portanto, existe a possibilidade de dados inválidos estarem presentes no banco de dados.
Se você precisar reativar a restrição, terá a oportunidade de restaurar a confiança da restrição (usando o
WITH CHECK
opção). Isso verificará todas as linhas existentes antes de ativar a restrição. Você também terá a opção de não verificar os dados existentes, mas isso só deve ser feito em casos raros.
Aqui está a mesma consulta novamente, mas com algumas colunas extras para mostrar as tabelas e tabelas referenciadas:
SELECT name AS 'Constraint', OBJECT_NAME(parent_object_id) AS 'Table', OBJECT_NAME(referenced_object_id) AS 'Referenced Table', is_disabled, is_not_trusted FROM sys.foreign_keys;
Resultado:
+--------------------------------+------------------+---------------------+---------------+------------------+ | Constraint | Table | Referenced Table | is_disabled | is_not_trusted | |--------------------------------+------------------+---------------------+---------------+------------------| | FK_BandMember_Band | BandMember | Band | 0 | 0 | | FK_BandMember_Musician | BandMember | Musician | 1 | 1 | | FK_MembershipPeriod_BandMember | MembershipPeriod | BandMember | 0 | 0 | +--------------------------------+------------------+---------------------+---------------+------------------+