Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como encontro o diretório de dados para uma instância do SQL Server?


Depende se o caminho padrão está definido para dados e arquivos de log ou não.

Se o caminho for definido explicitamente em Properties => Database Settings => Database default locations o servidor SQL o armazena em Software\Microsoft\MSSQLServer\MSSQLServer em DefaultData e DefaultLog valores.

No entanto, se esses parâmetros não forem definidos explicitamente, o SQL Server usará os caminhos de dados e log do banco de dados mestre.

Abaixo está o script que abrange ambos os casos. Esta é a versão simplificada da consulta que o SQL Management Studio executa.

Além disso, observe que eu uso xp_instance_regread em vez de xp_regread , então este script funcionará para qualquer instância, padrão ou nomeada.
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

Você pode obter o mesmo resultado usando SMO. Abaixo está um exemplo de C#, mas você pode usar qualquer outra linguagem .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;
}

É muito mais simples no SQL Server 2012 e superior, supondo que você tenha os caminhos padrão definidos (o que provavelmente é sempre a coisa certa a fazer):
select 
    InstanceDefaultDataPath = serverproperty('InstanceDefaultDataPath'),
    InstanceDefaultLogPath = serverproperty('InstanceDefaultLogPath')