sql >> Databasteknik >  >> RDS >> Sqlserver

Hur hittar jag datakatalogen för en SQL Server-instans?

Det beror på om standardsökvägen är inställd för data och loggfiler eller inte.

Om sökvägen är explicit inställd på Properties => Database Settings => Database default locations sedan lagrar SQL-servern den på Software\Microsoft\MSSQLServer\MSSQLServer i DefaultData och DefaultLog värden.

Men om dessa parametrar inte ställs in explicit, använder SQL-servern data- och loggsökvägar för huvuddatabasen.

Nedan är manuset som täcker båda fallen. Detta är en förenklad version av frågan som SQL Management Studio kör.

Observera också att jag använder xp_instance_regread istället för xp_regread , så det här skriptet kommer att fungera för alla instanser, standard eller namngivna.

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

Du kan uppnå samma resultat genom att använda SMO. Nedan är ett C#-exempel, men du kan använda vilket annat .NET-språk eller PowerShell som helst.

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;
}

Det är så mycket enklare i SQL Server 2012 och senare, förutsatt att du har angett standardsökvägar (vilket förmodligen alltid är rätt att göra):

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


  1. Lägg till veckor till ett datum i PostgreSQL

  2. Hur ska jag tackla --secure-file-priv i MySQL?

  3. Avancerad databasövervakning och hantering för TimescaleDB

  4. ASIN() Funktion i Oracle