83 votes

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

Nous avons un peu d' immenses bases de données (20 GO+) dont la plupart contiennent statique de données de recherche. Parce que notre application exécute des jointures sur des tables dans les bases de données, ils doivent faire partie de chaque développeurs SQL Server locale (c'est à dire qu'ils ne peuvent pas être hébergés sur une centrale, partagée serveur de base de données).

Nous comptons sur la copie d'un canoniques ensemble de la réelle base de données SQL Server les fichiers (*.mdf et *.ldf) et l'attacher à chaque développeur de base de données locale.

Quelle est la meilleure façon de découvrir l'instance SQL Server locale du répertoire de données de sorte que nous pouvons copier les fichiers au bon endroit? Cela se fait par le biais d'un processus automatisé, donc je dois être capable de le trouver et l'utiliser à partir d'un script de compilation.

112voto

Alex Aza Points 29204

Elle dépend de chemin d'accès par défaut est définie pour les données et les fichiers journaux ou non.

Si le chemin d'accès est défini explicitement Properties => Database Settings => Database default locations puis de SQL server stocke dans Software\Microsoft\MSSQLServer\MSSQLServer en DefaultData et DefaultLog valeurs.

Toutefois, si ces paramètres ne sont pas explicitement définie, SQL server utilise les Données et les chemins de Journal de base de données master.

Soufflet est le script qui couvre les deux cas. C'est la version simplifiée de la requête SQL Management Studio s'exécute.

Aussi, notez que j'utilise xp_instance_regread au lieu de xp_regread, de sorte que ce script fonctionne pour n'importe quelle instance, soit par défaut ou nommé.

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 @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

Vous pouvez obtenir le même résultat à l'aide de SMO. Soufflet est C# de l'échantillon, mais vous pouvez utiliser n'importe quel autre .NET de la langue ou de 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;
}

63voto

TDrudge Points 127

Même si c'est un fil très vieux, je sens que j'ai besoin de contribuer à une solution simple. Toutes les fois que vous savez où dans Management Studio, un paramètre est situé à laquelle vous voulez accéder à toute sorte de script automatisé, le plus simple est d'exécuter rapidement une trace du générateur de profils sur un test autonome système de capture et de ce Management Studio est en train de faire sur le backend.

Dans ce cas, en supposant que vous êtes intéressé à trouver le défaut de données et les journaux endroits, vous pouvez effectuer les opérations suivantes:

SÉLECTIONNEZ
SERVERPROPERTY('instancedefaultdatapath') [DefaultFile],
SERVERPROPERTY('instancedefaultlogpath') [DefaultLog]

33voto

Aaron Jensen Points 5170

Je suis tombé sur cette solution dans la documentation pour l'instruction Create Database dans l'aide de SQL Server:

SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)
                  FROM master.sys.master_files
                  WHERE database_id = 1 AND file_id = 1

28voto

Remus Rusanu Points 159382

select physical_name from sys.database_files;

8voto

Raj More Points 22358

Divers composants de SQL Server (Données, Journaux, SSAS, SSIS, etc) ont un répertoire par défaut. Le réglage de ce qui peut être trouvé dans le registre. Lire la suite ici:

http://technet.microsoft.com/en-us/library/ms143547%28SQL.90%29.aspx

Donc, si vous avez créé une base de données en utilisant seulement CREATE DATABASE MyDatabaseName il serait créé à l'emplacement spécifié dans l'un des paramètres ci-dessus.

Maintenant, si l'admin / installateur changé le chemin d'accès par défaut, le chemin par défaut de l'instance est enregistrée dans le registre à

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\[INSTANCENAME]\Setup

Si vous connaissez le nom de l'instance, alors vous pouvez interroger la base de registre. Cet exemple est SQL 2008 spécifique - laissez-moi savoir si vous avez besoin de la SQL2005 chemin.

DECLARE @regvalue varchar(100)

EXEC master.dbo.xp_regread @rootkey='HKEY_LOCAL_MACHINE',
    	@key='SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10.MSSQLServer\Setup',
    	@value_name='SQLDataRoot',
    	@value=@regvalue OUTPUT,
    	@output = 'no_output'

SELECT @regvalue as DataAndLogFilePath

Chaque base de données peut être créé en substituant les paramètres du serveur dans son propre emplacement lorsque vous émettez l' CREATE DATABASE DBName déclaration avec les paramètres appropriés. Vous pouvez le découvrir en exécution de sp_helpdb

exec sp_helpdb 'DBName'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X