Problema:
Abbiamo una tabella in un database SQL Server, vogliamo scrivere uno script che aggiunge un campo che sia non nullo e senza default.
Svolgimento:
Il semplice script seguente...
alter table MiaTabella
add MioCampo varchar(255) not null
...potrebbe non funzionare se la tabella ha già dei record. Infatti Una volta aggiunta la nuova colonna, che valore avrà per i record già presenti? Non potrà essere nulla, ma non è specificato un valore di default.
Per cui dovremmo scrivere il seguente script:
alter table MiaTabella
add MioCampo varchar(255) not null default ('')
In questo modo i vecchi record avranno come valore la stringa vuota e quindi lo script potrà essere eseguito.
Però a questo punto abbiamo bisogno di rimuovere il defualt.
La cosa non è banale: in SQL Server non potremo scrivere uno script del tipo ALTER TABLE per rimuove il default (lo potremmo fare con SQL Server Compact Edition). L'unico modo è quello di rimuovere il CONSTRAINT che definisce il default.
Ma come si chiama questo constraint? Quel nome viene creato da SQL Server e nel caso dello script sopra sarà del tipo:
DF__MiaTabella__MioCa__6E01572D
La soluzione che ho trovato io fa uso di un diverso script con sui viene definito esplicitamente il nome del CONSTRAINT, dandomi quindi la possibilità di rimuoverlo in modo molto semplice:
/* Aggiunge il campo MioCampo ed il constraint
(DF_MiaTabella_MioCampo) per il default temporaneo */
alter table MiaTabella
add MioCampo varchar(255) not null,
constraint DF_MiaTabella_MioCampo default '' for MioCampo
go
/* Rimuove il default temporaneo */
alter table MiaTabella
drop constraint DF_MiaTabella_MioCampo
go