Press "Enter" to skip to content

SQL Disattivare tutti i Vincoli di un database SQL Server

Ieri l’altro, in ufficio mi si è presentato il problema in oggetto, avevo infatti bisogno di modificare il campo principale per il legame fra i dati delle tabelle di un database.

Questo codice, un Intero, doveva essere modificato passando da 1 a 2, ovviamente essendo un vincolo di Foreign key su tutte le tabelle era un problema complesso da risolvere e il solo modo per farlo era quello di copiare tutti i dati tabella per tabella per poi rimuovere i dati errati.

Peccato però che essendovi alcune tabelle con relazione Padre Figlio sulla propria PK sarebbe stato un disastro trovare modo di fare la copia.

Togliere tutti i vincoli del DB a manina sarebbe stato piuttosto difficile, perché poi avrei anche dovuto rimetterli tutti perciò avrei dovuto fare una serie di script da olimpiade…

Poi, su suggerimento del mio collega Luca, che mi ha fatto notare come in Oracle esista un comando per disabilitare i vincoli in modo temporaneo per risolvere queste problematiche, mi sono detta, ma SQL Server non può avere qualcosa di meno di Oracle sennò come fa a fargli concorrenza seriamente :D:D:D. Sono andata a cercare in giro ed ho trovato questo codice che pubblico per non dimenticarmene sperando di dare una mano a chi dovesse trovarsi nella stessa necessità.

Ovviamente ricordo a tutti coloro che volessero usare questo codice, che prima di farlo devono essere perfettamente certi di cosa stanno facendo, in quanto se non gestiscono correttamente le modifiche che fanno potrebbero creare inconsistenze nel database pertanto, prima di usare questo codice si deve fare un Backup Full, Meglio due, inoltre suggerisco, se dovesse succedere di farlo su un DB di produzione, di fare prima un test su una macchina di prova per poi eseguire lo script sulla macchina vera.

A BUON INTENDITOR POCHE PAROLE!

--Disattivazione di tutti i vincoli
exec sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 

--Disattivazione di tutti i trigger
exec sp_MSforeachtable 'ALTER TABLE ? DISABLE TRIGGER ALL' 

-- Inserire qui il codice da eseguire per modificare il DB
-- Es. 
-- Update TBData Set IDCommon = 2 WHERE IDCommon = 1

--Riattivazione di tutti i vincoli
exec sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL' 

--Riattivazione di tutti i trigger
exec sp_MSforeachtable 'ALTER TABLE ? ENABLE TRIGGER ALL'