Por que o SQL Server falharia silenciosamente ao reativar uma restrição de chave estrangeira?
Recentemente, tentei reativar várias restrições usando ALTER TABLE
. A maioria habilitada com sucesso; no entanto, a minoria das restrições ainda é relatada como desativada por sys.foreign_keys
.
Exemplo:
ALTER TABLE [dbo].[Table] WITH CHECK NOCHECK CONSTRAINT FK_ConstraintName;
-- Command(s) completed successfully.
SELECT is_disabled FROM sys.foreign_keys
WHERE name = 'FK_Constraint' AND parent_object_id = OBJECT_ID('[dbo].[Table]');
-- returns "1", indicating that the constraint is still disabled
O problema que você está enfrentando é que você não está realmente reativando sua restrição (conforme definido pelo
NOCHECK
).A sintaxe para reativar uma restrição é a seguinte:
O
WITH CHECK|NOCHECK
informa ao SQL Server se você deseja ou não verificar os dados existentes na tabela em relação à restrição. Se você declararNOCHECK
aqui, sua restrição não será confiável, definida poris_not_trusted = 1
emsys.foreign_keys
.Ao declarar
NOCHECK
como a segunda parte, você está realmente dizendo para desabilitar a restrição .No seu caso, se você não quiser verificar os dados existentes, precisará
NOCHECK CHECK
.Leitura adicional sobre como confiar em suas restrições .