Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come trovo la directory dei dati per un'istanza di SQL Server?

Dipende dal fatto che il percorso predefinito sia impostato o meno per i dati e i file di registro.

Se il percorso è impostato in modo esplicito in Properties => Database Settings => Database default locations quindi SQL Server lo memorizza in Software\Microsoft\MSSQLServer\MSSQLServer in DefaultData e DefaultLog valori.

Tuttavia, se questi parametri non sono impostati in modo esplicito, il server SQL utilizza i percorsi di dati e registro del database master.

Di seguito è la sceneggiatura che copre entrambi i casi. Questa è la versione semplificata della query eseguita da SQL Management Studio.

Inoltre, nota che utilizzo xp_instance_regread invece di xp_regread , quindi questo script funzionerà per qualsiasi istanza, predefinita o denominata.

declare @DefaultData nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', @DefaultData output

declare @DefaultLog nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', @DefaultLog output

declare @DefaultBackup nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'BackupDirectory', @DefaultBackup output

declare @MasterData nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters', N'SqlArg0', @MasterData output
select @MasterData=substring(@MasterData, 3, 255)
select @MasterData=substring(@MasterData, 1, len(@MasterData) - charindex('\', reverse(@MasterData)))

declare @MasterLog nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters', N'SqlArg2', @MasterLog output
select @MasterLog=substring(@MasterLog, 3, 255)
select @MasterLog=substring(@MasterLog, 1, len(@MasterLog) - charindex('\', reverse(@MasterLog)))

select 
    isnull(@DefaultData, @MasterData) DefaultData, 
    isnull(@DefaultLog, @MasterLog) DefaultLog,
    isnull(@DefaultBackup, @MasterLog) DefaultBackup

Puoi ottenere lo stesso risultato usando SMO. Di seguito è riportato un esempio di C#, ma puoi usare qualsiasi altro linguaggio .NET o PowerShell.

using (var connection = new SqlConnection("Data Source=.;Integrated Security=SSPI"))
{
    var serverConnection = new ServerConnection(connection);
    var server = new Server(serverConnection);
    var defaultDataPath = string.IsNullOrEmpty(server.Settings.DefaultFile) ? server.MasterDBPath : server.Settings.DefaultFile;
    var defaultLogPath = string.IsNullOrEmpty(server.Settings.DefaultLog) ? server.MasterDBLogPath : server.Settings.DefaultLog;
}

È molto più semplice in SQL Server 2012 e versioni successive, supponendo che tu abbia impostato i percorsi predefiniti (che probabilmente è sempre una cosa giusta da fare):

select 
    InstanceDefaultDataPath = serverproperty('InstanceDefaultDataPath'),
    InstanceDefaultLogPath = serverproperty('InstanceDefaultLogPath')