Le chiavi esterne non sono attendibili dopo l'inserimento di massa


10

In un server SQL 2014 Edition (12.0.2430.0 - ancora nessun SP1) con un database in modalità compatibilità 2012 (lavorando per passare al 2014 ...) Ho una manciata di oggetti chiave esterna che sono costantemente contrassegnati come not trustednel database . Li ho rilasciati e ricreati senza NOCHECKopzioni, ma entro 5-10 minuti diventano nuovamente non attendibili e se generi uno CREATEscript viene visualizzato come:

ALTER TABLE [dbo].[Points]  WITH NOCHECK 
ADD  CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId])
REFERENCES [dbo].[Badge] ([Id])
GO

Lo script di creazione utilizzato è:

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

Non c'è replica, non ci sono strumenti di terze parti e sto monitorando tutte le istruzioni DDL sul database, quindi non è un altro utente.

Sono in grado di controllare bene i vincoli (usando WITH CHECK CHECKsu ciascuno) ma diventano poco attendibili poco dopo. Solo i lavori di manutenzione in esecuzione sono di Ola all'inizio del mattino e questo accade durante il giorno.

Aggiornare:

Quindi, dopo un paio di tracce per restringere le possibilità, sembra che un BULK INSERTpotrebbe FKnon fidarsi. Questa domanda msdn afferma che questa è una strada valida per rendere la chiave non affidabile, che è la prima volta che ne ho sentito parlare.

Quindi la mia domanda ora è: esiste una strategia alternativa all'utilizzo in BULK INSERTgrado di mantenere lo is_trustedstato di chiave esterna ? Viene eseguito nel contesto di un'applicazione in esecuzione più volte all'ora. Potrei avere gli sviluppatori in batch le loro istruzioni di inserimento, ma preferirei non mettere un ultimatum sull'uso BULK INSERTse non dovessi.

Risposte:


9

A BULK INSERTdalla nostra applicazione è stata la causa di chiavi esterne non attendibili, come confermato da una domanda MSDN . Analogamente BCP, ogni volta che BULK INSERTviene eseguita una a , la chiave esterna non viene controllata durante l'inserimento, quindi non è affidabile.

Come accennato da Kin, ci sono semplici script disponibili per trovare e correggere chiavi esterne non attendibili, ma nel mio scenario gli inserimenti avvengono con frequenza, il che fa di tutto per risolverlo senza valerne la pena.

E ypercube ha suggerito di utilizzare l' CHECK_CONSTRAINTS opzione all'interno degli inserti di massa che costringerebbe a rispettare il vincolo.

Ho intenzione di rivedere con gli sviluppatori per garantire che ogni utilizzo di BULK INSERTsia giustificato in termini di righe inserite, altrimenti dovrà essere qualcosa con cui convivere.


2
Stavo usando SqlBulkCopycon lo stesso effetto, ma c'è (almeno ora) un'opzione per fare la copia in blocco controllando ancora i vincoli - il che significa che la funzione di copia in blocco può fare il controllo in linea di principio, molto probabilmente bcp ha qualche opzione per abilitare quello. Chiunque abbia impostato la modalità di non controllo sull'impostazione predefinita deve essere preso a pugni in faccia.
Giovanni
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.