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

Como desabilitar uma restrição de chave estrangeira no SQL Server (Exemplos de T-SQL)


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                |
+--------------------------------+------------------+---------------------+---------------+------------------+