In che modo SqlBulkCopy circumnaviga i vincoli delle chiavi esterne?

foreign-keys sqlbulkcopy sql-server

Domanda

Ho usato SqlBulkCopy per inserire una raccolta di righe in una tabella. Ho dimenticato di impostare un valore intero sulle righe. La colonna mancante viene utilizzata per fare riferimento a un'altra tabella e viene applicata con un vincolo di chiave esterna.

Per ogni riga inserita, il valore intero finale era zero e zero non identificava una riga nella tabella correlata. Quando ho modificato il valore su un valore valido e poi ho provato a riportarlo a zero, non lo accetterei.

Quindi la mia domanda è: come fa SqlBulkCopy a lasciare il database in uno stato non valido?

Risposta accettata

in che modo SqlBulkCopy riesce a lasciare il database in uno stato non valido?

Disabilita le chiavi esterne sul tavolo in cui stai inserendo.

Sì, questo è un default orribile. Assicurati di impostare l'opzione CHECK_CONSTRAINTS (o CheckConstraints per SqlBulkCopy ) se puoi permettertelo.

Inoltre, per impostazione predefinita non attiva i trigger che è ugualmente terribile per la coerenza dei dati. I trigger ci sono per una ragione.


Risposta popolare

Per impostazione predefinita, i vincoli CHECK e FOREIGN KEY vengono ignorati durante l'operazione di copia bulk. SqlBulkCopy è una classe gestita che fornisce funzionalità simili a quelle offerte dal comando bcp di SQL Server. Il comando bcp ha un h- hint e, a meno che non forniate l' indizio CHECK_CONSTRAINTS, i vincoli CHECK e FOREIGN KEY vengono ignorati durante il caricamento di massa. L'articolo di technet afferma che: http://technet.microsoft.com/en-us/library/ms162802.aspx

Allo stesso modo la classe SqlBulkCopy ha un costruttore che accetta enum SqlBulkCopyOptions. Dovresti impostare l'opzione enum CheckConstraints per verificare che i vincoli siano spuntati - http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopyoptions(v=vs.110).aspx

Ecco un articolo che parla del controllo dei vincoli che controlla - http://technet.microsoft.com/en-us/library/ms186247(v=sql.105).aspx

Spero che questo ti aiuti.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow