SQL Server Verifique / NOCHECK diferença em scripts gerados

votos
16

Estou tentando sincronizar os esquemas entre a bases de dados diferentes. Basicamente, eu corri tarefas-> gerar scripts com SQL Server Management Studio (2005) em ambas as bases de dados e estou comparando a saída com uma ferramenta de comparação.

Por alguma razão, um script adiciona a restrição WITH CHECK e um sem verificação , seguido por ambos os constrangimentos sendo reativado.

I para o primeiro banco de dados eu recebo:

ALTER TABLE [dbo].[Profile]  WITH CHECK ADD  CONSTRAINT [FK_Profile_OrganizationID] FOREIGN KEY([OrganizationID])
REFERENCES [dbo].[Organization] ([OrganizationID])
GO
ALTER TABLE [dbo].[Profile] CHECK CONSTRAINT [FK_Profile_OrganizationID]
GO

A segunda base de dados gera quanto

ALTER TABLE [dbo].[Profile]  WITH NOCHECK ADD  CONSTRAINT [FK_Profile_OrganizationID] FOREIGN KEY([OrganizationID])
REFERENCES [dbo].[Organization] ([OrganizationID])
GO
ALTER TABLE [dbo].[Profile] CHECK CONSTRAINT [FK_Profile_OrganizationID]
GO

Então, eu tenho duas perguntas:

  1. É o resultado final do mesmo? ( Edit: Parece que um monte de pessoas estão pegando apenas a primeira declaração dos dois scripts Estou interessado no resultado final da totalidade de ambos os scripts.).

  2. Se o resultado final é o mesmo, por que Management Studio gerá-los de forma diferente para diferentes bancos de dados?

Publicado 26/08/2009 em 23:49
fonte usuário
Em outras línguas...                            


3 respostas

votos
16

O resultado final não é o mesmo!

SQL Server não vai confiar a singularidade do FK é que não está marcada. Isto significa processamento adicional é necessário se você usar a coluna em uma consulta.
Longa história curta é que você deve obter SQL Server para verificar a coluna por isso é considerado confiável.

Quanto ao porquê eles são diferentes a partir de diferentes servidores, verifique a coluna isnottrusted em sys.foreign_keys. Isso pode afetar o SSMS está gerando?

Para mais de um discurso retórico sobre isso, verifique minha outra resposta que se relaciona com FK & nenhuma verificação / check opções.

Respondeu 27/08/2009 em 03:29
fonte usuário

votos
12

Sim, eles os dois scripts são diferentes

WITH CHECK irá verificar os dados existentes contra a nova restrição.
COM NOCHECK não irá verificar os dados existentes contra a nova restrição. Isto irá permitir que você tenha registros filho sem um pai correspondente.

EDIT: Quanto ao porquê de SSMS está fazendo isso eu não tenho idéia

Respondeu 27/08/2009 em 02:28
fonte usuário

votos
0

Ambos são 2005 servidores SQL Server? Como o resultado é o mesmo, a ferramenta de geração de código talvez usar rotinas diferentes com base em diferentes versões do produto

Respondeu 27/08/2009 em 02:51
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more