Ricavare i path di default per i file di dati e logs in SQL Server 2005

Una delle impostazioni che possibile fare su un’istanza di SQL Server è quella del percorso di default in cui memorizzare file dati e logs di un nuovo database. Ho fatto diverse ricerca, ma non trovato un modo semplice per ricavare tramite T-SQL tali informazioni.

A quanto sembra se si modificano tali percorsi questi vengono memorizzati nelle chiavi di registry:

  • HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\MSSQLServer\DefaultData
  • HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\MSSQLServer\DefaultLog

In caso contrario i path è quello specificato durante l’installazione per i File di dati quindi si può pensare di ricavarli dai path dei file mdf e ldf del database master.

Di seguito uno script T-SQL per ricavare il path di default per i file di dati:

USE master
declare @DefaultData nvarchar(512)

–Lettura chiave di registry HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\MSSQLServer\DefaultData
EXEC xp_instance_regread N’HKEY_LOCAL_MACHINE’,
 N’Software\Microsoft\MSSQLServer\MSSQLServer’, N’DefaultData’,
 @DefaultData OUTPUT, ‘no_output’

–Se la chiave di registry non esiste si utilizza il path del file mdf del database master
IF (@DefaultData IS NULL)
 BEGIN
  SELECT  @DefaultData = SUBSTRING(physical_name, 0, CHARINDEX(N’master.mdf’, physical_name))
  FROM sys.database_files
  WHERE name=’master’
 END

–Rimozione eventuale slash finale
IF ((@DefaultData IS NOT NULL) AND (CHARINDEX(N’\’, @DefaultData, len(@DefaultData)) > 0))
BEGIN
 SELECT @DefaultData = STUFF (@DefaultData,len(@DefaultData),1,N”)
END

SELECT @DefaultData

Mentre questo è lo script per ricavare il path di default per i file di log:

USE master
declare @DefaultLog nvarchar(512)

–Lettura chiave di registry HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\MSSQLServer\DefaultLog
EXEC xp_instance_regread N’HKEY_LOCAL_MACHINE’,
 N’Software\Microsoft\MSSQLServer\MSSQLServer’, N’DefaultLog’,
 @DefaultLog OUTPUT, ‘no_output’

–Se la chiave di registry non esiste si utilizza il path
–del file mdf del database master
IF (@DefaultLog IS NULL)
 BEGIN
  SELECT  @DefaultLog = SUBSTRING(physical_name, 0, CHARINDEX(N’mastlog.ldf’, physical_name))
  FROM sys.database_files
  WHERE name=’mastlog’
 END

–Rimozione eventuale slash finale
IF ((@DefaultLog IS NOT NULL) AND (CHARINDEX(N’\’, @DefaultLog, len(@DefaultLog)) > 0))
BEGIN
 SELECT @DefaultLog = STUFF (@DefaultLog,len(@DefaultLog),1,N”)
END

SELECT @DefaultLog

Se poi occorre usare questi script in un programma .NET il mio consiglio è quello di non inserire lo script nel codice, ma di creare dei file con estensione sql in questo modo Visual Studio visualizzerà lo script evidenziando le parole chiave esattamente come in Management Studio. Quindi aggiungere il file come risorsa in questo modo VS 2005 e sucessivi creeranno una comoda prorietà stringa in My.Resources che conterrà il testo del file. In VS 2003 è possibile impostare il file come Embedded e tramite un po’ di codice leggere il contenuto del file:

        Dim text As String = String.Empty
        Dim resource As System.IO.Stream = _
            System.Reflection.Assembly.GetExecutingAssembly.GetManifestResourceStream( _
                “NameSpace.FileName“)

        Dim reader As New System.IO.StreamReader(resource)
        text = reader.ReadToEnd()

        reader.Close() : reader = Nothing
        resource.Close() : resource = Nothing