Em um servidor da edição SQL 2014 (12.0.2430.0 - ainda sem SP1) com um banco de dados no modo de compatibilidade de 2012 (trabalhando para alterá-lo para 2014 ...), tenho um punhado de objetos de chave estrangeira que são marcados consistentemente como not trusted
no banco de dados . Eu os descartei e os recriei sem NOCHECK
opções, mas em 5 a 10 minutos eles se tornaram não confiáveis novamente e, se eu gerar um CREATE
script, ele sairá como:
ALTER TABLE [dbo].[Points] WITH NOCHECK
ADD CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId])
REFERENCES [dbo].[Badge] ([Id])
GO
O script de criação que está sendo usado é:
ALTER TABLE [dbo].[Points]
ADD CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId])
REFERENCES [dbo].[Badge] ([Id])
GO
ALTER TABLE [dbo].[Points] CHECK CONSTRAINT [FK_BadgeId]
GO
Não há replicação, não há ferramentas de terceiros e estou monitorando todas as instruções DDL no banco de dados para que não seja outro usuário.
Eu sou capaz de verificar bem as restrições (usando WITH CHECK CHECK
em cada), mas elas ainda se tornam não confiáveis logo depois. Apenas os trabalhos de manutenção executados são de Ola no início da manhã e isso acontece ao longo do dia.
Atualizar:
Então, depois de alguns rastreamentos para reduzir as possibilidades, parece que a BULK INSERT
pode estar fazendo com que o FK
se torne não confiável. Esta pergunta msdn afirma que esta é uma rota válida para a chave se tornar não confiável, que é a primeira vez que ouço falar dela.
Então, minha pergunta agora é: existe uma estratégia alternativa para usar BULK INSERT
que possa manter o is_trusted
status de chave estrangeira? Ele está sendo executado no contexto de um aplicativo executado várias vezes por hora. Em vez disso, eu poderia fazer com que os desenvolvedores agrupassem suas instruções de inserção, mas prefiro não colocar um ultimato no uso BULK INSERT
se não for necessário.
A
BULK INSERT
de nosso aplicativo foi a causa de chaves estrangeiras não confiáveis, conforme confirmado por uma pergunta do MSDN . Semelhante aBCP
, sempre que aBULK INSERT
é executado, a chave estrangeira não é verificada durante a inserção, tornando-a não confiável.Como Kin mencionou, existem scripts simples disponíveis para localizar e corrigir chaves estrangeiras não confiáveis, mas no meu cenário as inserções estão acontecendo com frequência, o que faz com que o esforço para corrigir constantemente esse problema não valha a pena.
E o ypercube sugeriu o uso de
CHECK_CONSTRAINTS
opções dentro das inserções em massa que forçariam a restrição a ser obedecida.Pretendo revisar com os desenvolvedores para garantir que cada uso de
BULK INSERT
seja justificado em termos de linhas inseridas, caso contrário, terá que ser algo para se conviver.