Come rinominare una colonna senza intaccare le logiche dei nostri database

L’operazione di rinomina di una colonna appartenente ad una tabella o ad una vista non è qualcosa di cui uno sviluppatore su SQL Server necessità tutti i giorni. Tuttavia, quando serve, com’è possibile fare in modo che l’operazione sia indolore e priva di difficoltà?

Rinominare una colonna può sembrare molto semplice. Ad esempio, per cambiare il nome della colonna TerritoryID della tabella Sales.SalesTerritory in TerrID, è sufficiente eseguire il seguente statement:

EXECUTE sp_rename 'Sales.SalesTerritory.TerritoryID', 'TerrID', 'COLUMN';

Otterremo però il seguente warning:

Caution: Changing any part of an object name could break scripts and stored procedures.

In aggiunta, riceveremo probabilmente anche questo messaggio:

Object ‘Sales.SalesTerritory.TerritoryID’ cannot be renamed because the object participates in enforced dependencies.

Che succede eseguendo lo script?

Immaginiamo di avere una stored procedure chiamata Sales.vTer che referenzia la colonna TerritoryId della tabella Sales.SalesTerritory. La procedura sp_rename si occupa di rinominare solamente la colonna senza preoccuparsi del legame che quest’ultima ha con la procedura Sales.vTer.

Questo significa che, dopo l’esecuzione dello script, la tabella avrà la colonna rinominata in TerrId mentre la stored procedure continuerà ad avere il nome precedente (TerritoryID), il quale non esiste più. L’esecuzione della stored procedure Sales.vTer tornerà un errore e fallirà.

Cosa sono le “enforced dependencies” (dipendenze forzate)?

Una dipendenza si dice “forzata” quando esiste una relazione denominata “associata allo schema” (schema-bound) tra l’oggetto che referenzia e quello referenziato. La relazione impedisce l’eliminazione dell’oggetto referenziato. Al fine di rinominare con successo la colonna, risulta necessario aggiornare il nome della colonna nell’oggetto che la referenzia.

Come capire quali oggetti sono coinvolti dal cambiamento di nome della colonna?

SQL Server Management Studio può mostrare le dipendenze con la sua opzione “Visualizza dipendenze”. Si tratta di una finestra che mostra gli oggetti che dipendono da quello selezionato e gli oggetti che sono dipendenti. Tuttavia, non è possibile fare altro se non aggiornare a mano ogni elemento coinvolto.

Per rinominare la colonna con sp_rename è necessario:

  1. Ricavare la lista gli oggetti dipendenti (riferimenti)
  2. Fare drop delle dipendenze forzate
  3. Rinominare con la procedura sp_rename
  4. Ricreare le dipendenze forzate precedentemente eliminate
  5. Ripetere i passi da 1 a 4 nel caso di rinomina di più colonne

Di certo non è un approccio molto produttivo, anzi risulta a volte essere frustrante.

Com’è possibile rinominare in maniera veloce ed affidabile?

ApexSQL Search ci può aiutare durante questa operazione. È un add-in FREE ed è disponibile sia su SQL Server Management Studio che su Visual Studio. Effettua la ricerca nelle definizioni degli oggetti di un database SQL Server e anche nei dati nel caso di tabelle e viste. Consente di rinominare tabelle, viste, procedure, funzioni, colonne, nomi di parametri e schema, in maniera silente ed affidabile, senza danneggiare le logiche preesistenti e mostrando le interdipendenze degli oggetti coinvolti.

  1. Aprire SQL Server Management Studio o Visual Studio
  2. Navigare su una tabella, vista o colonna che si vuole rinominare direttamente sull’Esplora Oggetti
  3. Premere il tasto destro del mouse e selezionare Safe Rename dal menu ApexSQL Search:
  4. Per visualizzare i cambiamenti che verranno applicati, premere Generate preview nella schermata Safe rename column
  5. Il tab Generated script mostrerà lo script che verrà eseguito al fine di rinominare la colonna selezionata
  6. Aprire il tab Warnings per controllare i potenziali problemi in cui si può incorrere durante il processo di rinomina
  7. Aprire il tab Sequence per controllare ciò che verrà applicato durante la fase di rinomina. Si tratta dell’elenco delle operazioni manuali che, in mancanza del tool, avremmo dovuto eseguire
  8. Aprire il tab Dependencies per visualizzare gli oggetti che dipendono dalla colonna rinominata. Si tratta della lista degli oggetti che verranno modificati automaticamente. Utilizzando la sp_rename, avremmo dovuto ancora una volta fare tutto a mano step by step
  9. Per modificare lo script prima di eseguirlo, premere il pulsante Open. Lo script generato verrà aperto in SQL Server Management Studio come nuova query, oppure in Visual Studio editor review. Se necessario, è possibile modificare prima di eseguirlo tramite la pressione del pulsante Execute. È altrimenti possibile salvare su file di testo lo script
  10. Per eseguire lo script così com’è, premere Rename button

Rinominare una colonna può essere quindi molto semplice e soprattutto FREE. Non è necessario analizzare per intero i nostri database e non serve cercare le dipendenze. ApexSQL Search può farlo per noi. Il tool troverà gli oggetti dipendenti, rinominerà e farà DROP/CREATE quando necessario. Il tutto per evitare i problemi di cui parlavamo all’inizio.

Traduttore: Alessandro Alpi

October 1, 2014