Se vi siete imbattuti in questo articolo è probabile che siate alle prese con la necessità di modificare il tipo o il formato di una colonna interna a una tabella SQL Server con una query di tipo ALTER COMMAND, che però vi restituisce un Command Timeout. In questo articolo illustrerò un workaround che consente di farlo senza dover riavviare il DB Server utilizzando la Stored Procedure predefinita SP_CONFIGURE.
Il problema
Prendiamo ad esempio la seguente tabella SQL Attachments, utilizzata per gestire dei file allegati di grandi dimensioni:
1 2 3 4 5 |
CREATE TABLE [dbo].[Attachments]( [ID] [int] IDENTITY(1,1) NOT NULL, [Data] [image] NULL, [FileName] [nvarchar](250) NULL, [Description] [nvarchar](250) NULL) |
Immaginiamo ora di voler modificare la colonna Description, portandola da nvarchar(250) a nvarchar(MAX). Inutile dire che il database si trova in produzione, quindi non abbiamo la possibilità di arrestarlo o riavviarlo: al tempo stesso i file, ovvero record contenuti nella tabella, sono centinaia di migliaia. Questo significa che, provando a eseguire una ALTER query come la seguente:
1 |
ALTER TABLE Attachments ALTER COLUMN Description nvarchar(max) NULL; |
Ci verrà certamente restituito un Connection Timeout.
Cosa possiamo fare?
La soluzione
Il miglior workaround che ho trovato per gestire situazioni di questo tipo è quello di utilizzare SP_CONFIGURE, una delle tante Stored Procedure già presenti all'interno della dotazione standard di SQL Server. Questa procedura può essere utilizzata per visualizzare, ed eventualmente anche per modificare, le principali opzioni di configurazione del server. Nello specifico, l'impostazione che vogliamo modificare è "remote query timeout", che per impostazione predefinita è impostata a 600 (secondi).
Il piano è dunque: portare questa impostazione a zero, eseguire la nostra query (senza più rischiare alcun timeout) e poi riportarla a 600 immediatamente dopo. Ecco come è possibile farlo:
1 2 3 4 5 |
EXEC SP_CONFIGURE 'remote query timeout', 0; reconfigure; ALTER TABLE Attachments ALTER COLUMN Description nvarchar(max) NULL; EXEC SP_CONFIGURE 'remote query timeout', 600; reconfigure; |
Ovviamente, prima di eseguire questo elenco di comandi, è opportuno sincerarsi che l'impostazione configurata sul server SQL sia effettivamente valorizzata a 600. Per far questo possiamo eseguire SP_CONFIGURE in modalità display, ottenendo un elenco di tutte le impostazioni attualmente configurate comprensive del valore attualmente impostato:
1 |
EXEC SP_CONFIGURE; |
Ovviamente, qualora il valore del parametro "remote query timeout" risulti diverso da 600, sarà opportuno modificare il penultimo comando presente nell'elenco di query riportato in precedenza, così da assicurare il ripristino del valore originario.