Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment trouver le répertoire de données d'une instance SQL Server ?

Cela dépend si le chemin par défaut est défini pour les données et les fichiers journaux ou non.

Si le chemin est défini explicitement dans Properties => Database Settings => Database default locations puis le serveur SQL le stocke dans Software\Microsoft\MSSQLServer\MSSQLServer dans DefaultData et DefaultLog valeurs.

Cependant, si ces paramètres ne sont pas définis explicitement, le serveur SQL utilise les chemins de données et de journal de la base de données principale.

Voici le script qui couvre les deux cas. Il s'agit d'une version simplifiée de la requête exécutée par SQL Management Studio.

Notez également que j'utilise xp_instance_regread au lieu de xp_regread , donc ce script fonctionnera pour n'importe quelle instance, par défaut ou nommée.

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

Vous pouvez obtenir le même résultat en utilisant SMO. Ci-dessous est un exemple C#, mais vous pouvez utiliser n'importe quel autre langage .NET ou 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;
}

C'est tellement plus simple dans SQL Server 2012 et supérieur, en supposant que vous ayez défini des chemins par défaut (ce qui est probablement toujours une bonne chose à faire) :

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