Desabilitar restrições de chave estrangeira com instruções INSERT e UPDATE
Aplica-se a: SQL Server 2016 (13.x) e versões posteriores Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System)
Você pode desabilitar uma restrição de chave estrangeira durante transações INSERT e UPDATE no SQL Server usando o SQL Server Management Studio ou o Transact-SQL. Use essa opção se você souber que novos dados não violarão a restrição existente ou se a restrição se aplicar somente aos dados que já estão no banco de dados.
Limitações e restrições
Depois de desabilitar essas restrições, as inserções ou atualizações futuras na coluna não serão validadas em relação às condições de restrição.
Permissões do
Exige a permissão ALTER na tabela.
Usar o SQL Server Management Studio
Para desabilitar uma restrição de chave estrangeira para instruções INSERT e UPDATE
No Pesquisador de Objetos, expanda a tabela com a restrição e expanda a pasta Chaves .
Clique com o botão direito do mouse na restrição e selecione Modificar.
Na grade em Designer de Tabela, selecione Impor Restrição de Chave Estrangeira e Não no menu suspenso.
Selecione Fechar.
Para reabilitar a restrição quando desejado, inverta as etapas acima. Selecione Impor Restrição de Chave Estrangeira e selecione Sim no menu suspenso.
Para confiar na restrição verificando os dados existentes na relação da chave estrangeira, selecione Verificar Dados Existentes na Criação ou Reabilitação e selecione Sim no menu suspenso. Isso garantiria que a restrição de chave estrangeira fosse confiável.
- Se Verificar Dados Existentes na Criação ou Reabilitação está definido como Não, a chave estrangeira não verifica os dados existentes quando eles são habilitados novamente. Portanto, o otimizador de consulta não pode considerar possíveis melhorias de desempenho. Chaves estrangeiras confiáveis são recomendadas porque podem ser usadas para simplificar planos de execução com suposições baseadas na restrição de chave estrangeira. Para verificar se as chaves estrangeiras são confiáveis em seu banco de dados, confira uma consulta de exemplo mais adiante neste artigo.
Usar o Transact-SQL
Para desabilitar uma restrição de chave estrangeira para instruções INSERT e UPDATE
No Pesquisador de Objetos, conecte-se a uma instância do Mecanismo de Banco de Dados.
Na barra Padrão, selecione Nova Consulta.
Copie e cole o exemplo a seguir na janela de consulta e selecione Executar.
USE AdventureWorks2022; GO ALTER TABLE Purchasing.PurchaseOrderHeader NOCHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID; GO
Para reabilitar a restrição quando desejado, copie e cole o exemplo a seguir na janela de consulta e selecione Executar.
USE AdventureWorks2022; GO ALTER TABLE Purchasing.PurchaseOrderHeader CHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID; GO
Verifique se a restrição em seu ambiente é confiável e está habilitada. Se
is_not_trusted
= 1, a chave estrangeira não verificará os dados existentes quando for habilitada novamente ou recriada. Portanto, o otimizador de consulta não pode considerar possíveis melhorias de desempenho. Chaves estrangeiras confiáveis são recomendadas porque podem ser usadas para simplificar planos de execução com suposições baseadas na restrição de chave estrangeira. Copie e cole o exemplo a seguir na janela de consulta e selecione Executar.SELECT o.name, fk.name, fk.is_not_trusted, fk.is_disabled FROM sys.foreign_keys AS fk INNER JOIN sys.objects AS o ON fk.parent_object_id = o.object_id WHERE fk.name = 'FK_PurchaseOrderHeader_Employee_EmployeeID'; GO
Você deve definir a restrição de chave estrangeira como confiável se os dados existentes na tabela estão em conformidade com a restrição de chave estrangeira. Para definir a chave estrangeira como confiável, use o script a seguir para confiar novamente na restrição de chave estrangeira, anotando a sintaxe adicional
WITH CHECK
. Copie e cole o exemplo a seguir na janela de consulta e selecione Executar.ALTER TABLE [Purchasing].[PurchaseOrderHeader] WITH CHECK CHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID; GO