Estou analisando o banco de dados de exemplo AdventureWorks para SQL Server 2008 e vejo nos scripts de criação que eles tendem a usar o seguinte:
ALTER TABLE [Production].[ProductCostHistory] WITH CHECK ADD
CONSTRAINT [FK_ProductCostHistory_Product_ProductID] FOREIGN KEY([ProductID])
REFERENCES [Production].[Product] ([ProductID])
GO
seguido imediatamente por:
ALTER TABLE [Production].[ProductCostHistory] CHECK CONSTRAINT
[FK_ProductCostHistory_Product_ProductID]
GO
Eu vejo isso para chaves estrangeiras (como aqui), restrições exclusivas e CHECK
restrições regulares ; DEFAULT
restrições usam o formato regular com o qual estou mais familiarizado, como:
ALTER TABLE [Production].[ProductCostHistory] ADD CONSTRAINT
[DF_ProductCostHistory_ModifiedDate] DEFAULT (getdate()) FOR [ModifiedDate]
GO
Qual é a diferença, se houver, entre fazê-lo da primeira maneira versus a segunda?
fonte
ALTER TABLE foo NOCHECK CONSTRAINT fk_b
e depois reativá-la comALTER TABLE foo CHECK CONSTRAINT fk_b
ela, não verificará a restrição.ALTER TABLE foo WITH CHECK CHECK CONSTRAINT fk_b
é necessário para que os dados sejam verificados.Para demonstrar como isso funciona--
fonte
DROP TABLE T2; DROP TABLE T1;
Além dos excelentes comentários acima sobre restrições confiáveis:
Uma restrição não confiável, como o nome sugere, não pode ser confiável para representar com precisão o estado dos dados na tabela no momento. No entanto, pode ser confiável para verificar os dados adicionados e modificados no futuro.
Além disso, restrições não confiáveis são desconsideradas pelo otimizador de consultas.
O código para ativar restrições de verificação e restrições de chave estrangeira é bastante ruim, com três significados da palavra "verificação".
fonte
WITH NOCHECK
também é usado quando se tem dados existentes em uma tabela que não está em conformidade com a restrição definida e você não deseja que ela colide com a nova restrição que você está implementando ...fonte
WITH CHECK
é realmente o comportamento padrão, no entanto, é uma boa prática incluir na sua codificação.É claro que o comportamento alternativo é usado
WITH NOCHECK
, por isso é bom definir explicitamente suas intenções. Isso geralmente é usado quando você está tocando com / modificando / alternando partições embutidas.fonte
As restrições de chave estrangeira e verificação têm o conceito de serem confiáveis ou não confiáveis, além de serem ativadas e desativadas. Consulte a página do MSDN
ALTER TABLE
para obter detalhes completos.WITH CHECK
é o padrão para adicionar novas chaves estrangeiras e verificar restrições,WITH NOCHECK
é o padrão para reativar chaves estrangeiras desativadas e verificar restrições. É importante estar ciente da diferença.Dito isto, quaisquer declarações aparentemente redundantes geradas pelos utilitários estão simplesmente lá para segurança e / ou facilidade de codificação. Não se preocupe com eles.
fonte
WITH CHECK CHECK CONSTRAINT
para que eles sejam confiáveis.select * from sys.objects where [type] in ('C', 'F') and (objectproperty([object_id], 'CnstIsDisabled') = 1 or objectproperty([object_id], 'CnstIsNotTrusted') = 1)
encontrar restrições desabilitadas e não confiáveis. Depois de emitir as instruções apropriadas da tabela alter, como acima, essas restrições desaparecem da consulta, para que eu possa vê-la funcionando.Aqui está um código que escrevi para nos ajudar a identificar e corrigir CONSTRAINTs não confiáveis em um banco de dados. Ele gera o código para corrigir cada problema.
fonte