Archivio

Posts Tagged ‘vincoli check’

BUG Sql2005: via le parentesi nei vincoli Check

12 luglio 2010 MarcoB Nessun commento

Se si tenta di creare o modificare un vincolo CHECK utilizzando Microsoft Sql Server Management Studio 2005 attenzione alle parentesi!

Lo strumento visuale elimina tutte le parentesi dell’espressione booleana, lasciando solo quelle esterne. Nessun problema per espressioni semplici, ma nel caso di logica più complessa o di alterazione della precedenza degli operatori sono guai. Ad esempio l’espressione:

(A AND B) OR (C AND D)
[Vero se A e B sono veri oppure se C e D sono veri]

verrebbe trasformata in

(A AND B OR C AND D)
[Vero se A è vero oppure se B o C sono veri o se D è vero]

con conseguente disastro.

In tal caso si risolve utilizzando la creazione del vincolo tramite script, come ad esempio:

ALTER TABLE [NomeTabella] WITH CHECK
ADD CONSTRAINT [CK_NomeVincolo] CHECK  ((A AND B) OR (C AND D))

Approfondendo ulteriormente si osserva che la colpa del bug non sembra tanto dello strumento visuale, quanto dello strumento che legge la definizione del vincolo dal database. Se si seleziona il vincolo nell’esploratore oggetti e si lancia il comando “Crea script per vincolo…” si ottiene uno script con lo stesso problema: parentesi scomparse!

Share