76

静的ルックアップデータをほとんど含む巨大なデータベース(20GB以上)がいくつかあります。私たちのアプリケーションはこれらのデータベースのテーブルに対して結合を実行するため、それらは各開発者のローカルSQL Serverの一部である必要があります(つまり、中央の共有データベースサーバーでホストすることはできません)。

実際のSQLServerデータベースファイル(*.mdfおよび*.ldf)の正規のセットをコピーして、各開発者のローカルデータベースに添付する予定です。

ファイルを適切な場所にコピーできるように、ローカルSQL Serverインスタンスのデータディレクトリを見つけるための最良の方法は何ですか?これは自動化されたプロセスを介して行われるため、ビルドスクリプトから見つけて使用できる必要があります。

4

15 に答える 15

108

データおよびログ ファイルにデフォルト パスが設定されているかどうかによって異なります。

パスがProperties=> Database Settings=>で明示的に設定されている場合、 Database default locationsSQL サーバーはそれをSoftware\Microsoft\MSSQLServer\MSSQLServerDefaultDataDefaultLog値に格納します。

ただし、これらのパラメーターが明示的に設定されていない場合、SQL サーバーはマスター データベースのデータ パスとログ パスを使用します。

以下は、両方のケースをカバーするスクリプトです。これは、SQL Management Studio が実行するクエリの簡略化されたバージョンです。

xp_instance_regreadまた、代わりにを使用していることに注意してくださいxp_regread。したがって、このスクリプトは、デフォルトまたは名前付きの任意のインスタンスで機能します。

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

SMO を使用して同じ結果を得ることができます。以下は C# のサンプルですが、他の .NET 言語や 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;
}

デフォルトのパスが設定されていると仮定すると、SQL Server 2012以降では非常に簡単です(これはおそらく常に正しいことです):

select 
    InstanceDefaultDataPath = serverproperty('InstanceDefaultDataPath'),
    InstanceDefaultLogPath = serverproperty('InstanceDefaultLogPath')
于 2012-10-06T05:21:03.770 に答える
57

これは非常に古いスレッドですが、簡単な解決策を提供する必要があると感じています。自動化されたスクリプトでアクセスしたいパラメーターが Management Studio のどこにあるかがわかっている場合、最も簡単な方法は、スタンドアロン テスト システムでクイック プロファイラー トレースを実行し、Management Studio がバックエンドで行っていることをキャプチャすることです。 .

この場合、デフォルトのデータとログの場所を見つけることに関心があると仮定すると、次のことができます。

SELECT
  SERVERPROPERTY('instancedefaultdatapath') AS [DefaultFile],
  SERVERPROPERTY('instancedefaultlogpath') AS [DefaultLog]
于 2013-05-21T23:46:02.537 に答える
33

SQL Server のヘルプにある Create Database ステートメントのドキュメントで、このソリューションを偶然見つけました。

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
于 2009-12-10T18:48:22.073 に答える
27

現在のデータベースの場合、次を使用できます。

select physical_name fromsys.database_files;

'Model' などの別のデータベースを指定するには、sys.master_files を使用します。

select physical_name from sys.master_files where database_id = DB_ID(N'Model');

于 2009-12-10T18:40:41.757 に答える
8

SQL Server のさまざまなコンポーネント (データ、ログ、SSAS、SSIS など) には既定のディレクトリがあります。この設定はレジストリにあります。ここでもっと読む:

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

したがって、CREATE DATABASE MyDatabaseNameそれを使用してデータベースを作成すると、上記の設定のいずれかで指定されたパスに作成されます。

これで、管理者またはインストーラーがデフォルト パスを変更した場合、インスタンスのデフォルト パスが次のレジストリに保存されます。

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

インスタンスの名前がわかっている場合は、レジストリを照会できます。この例は SQL 2008 固有のものです。SQL2005 のパスも必要な場合はお知らせください。

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

CREATE DATABASE DBName各データベースは、適切なパラメーターを指定してステートメントを発行すると、独自の場所でサーバー設定をオーバーライドして作成できます。sp_helpdb を実行すると、それを確認できます。

exec sp_helpdb 'DBName'
于 2009-12-10T18:51:25.450 に答える
6

シンプルに保つ:

use master
select DB.name, F.physical_name from sys.databases DB join sys.master_files F on DB.database_id=F.database_id

これにより、関連ファイルを含むすべてのデータベースが返されます

于 2013-05-15T11:44:06.610 に答える
2

GUIから:サーバーのプロパティを開き、[データベースの設定]に移動して、[データベースのデフォルトの場所]を確認します。

データベースファイルは好きな場所にドロップできますが、デフォルトのディレクトリに保持する方がクリーンなようです。

于 2009-12-10T18:38:28.657 に答える
1

ちょっとしたコツ: データ フォルダーはなく、既定のデータ フォルダーのみです。

とにかく、それを見つけるには、最初のデフォルト インスタンスをインストールする場合:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\Setup\SQLDataRoot

名前付きインスタンスがある場合、MSSQL.1 は MSSQL10.INSTANCENAME のようになります。

于 2009-12-10T18:42:59.897 に答える
0
SELECT DISTINCT dbo.GetDirectoryPath(filename) AS InstanceDataPaths
FROM sys.sysaltfiles WHERE filename like '%.mdf' and filename not like '%\MSSQL\Binn\%'

SELECT DISTINCT dbo.GetDirectoryPath(filename) AS InstanceLogPaths
FROM sys.sysaltfiles WHERE filename like '%.ldf' and filename not like '%\MSSQL\Binn\%'

ここに画像の説明を入力

詳細な SQL スクリプトは、SQL Server インスタンスのデータ ディレクトリを検索する方法からダウンロードできます。

于 2016-11-29T02:54:02.803 に答える
0

アレックスの答えは正しいものですが、後世のために別のオプションがあります。新しい空のデータベースを作成します。ターゲットディレクトリを指定せずにCREATE DATABASEを使用すると、デフォルトのデータ/ログディレクトリが得られます。簡単。

ただし、個人的には、おそらく次のいずれかを行います。

  • コピー/アタッチするのではなく、データベースを開発者の PC に復元します (バックアップは圧縮して UNC で公開できます)、または
  • そもそもこれを避けるために、リンクサーバーを使用してください(結合を超えるデータの量によって異なります)

ps: 2015 年になっても、20 GB はそれほど大きくありません。しかし、それはすべて相対的なものです。

于 2016-06-29T04:23:12.233 に答える
0

次の T-SQL を使用して、現在の SQL Server インスタンスの既定のデータとログの場所を見つけることができます。

DECLARE @defaultDataLocation nvarchar(4000)
DECLARE @defaultLogLocation nvarchar(4000)

EXEC master.dbo.xp_instance_regread
    N'HKEY_LOCAL_MACHINE',
    N'Software\Microsoft\MSSQLServer\MSSQLServer',
    N'DefaultData', 
    @defaultDataLocation OUTPUT

EXEC master.dbo.xp_instance_regread
    N'HKEY_LOCAL_MACHINE',
    N'Software\Microsoft\MSSQLServer\MSSQLServer',
    N'DefaultLog', 
    @defaultLogLocation OUTPUT

SELECT @defaultDataLocation AS 'Default Data Location',
       @defaultLogLocation AS 'Default Log Location'
于 2012-09-11T11:56:26.110 に答える
0

「飛び散ったビット」の回答を拡張すると、これを行う完全なスクリプトが次のようになります。

@ECHO off
SETLOCAL ENABLEDELAYEDEXPANSION

SET _baseDirQuery=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;
ECHO.
SQLCMD.EXE -b -E -S localhost -d master -Q "%_baseDirQuery%" -W >data_dir.tmp
IF ERRORLEVEL 1 ECHO Error with automatically determining SQL data directory by querying your server&ECHO using Windows authentication.
CALL :getBaseDir data_dir.tmp _baseDir

IF "%_baseDir:~-1%"=="\" SET "_baseDir=%_baseDir:~0,-1%"
DEL /Q data_dir.tmp
echo DataDir: %_baseDir%

GOTO :END
::---------------------------------------------
:: Functions 
::---------------------------------------------

:simplePrompt 1-question 2-Return-var 3-default-Val
SET input=%~3
IF "%~3" NEQ "" (
  :askAgain
  SET /p "input=%~1 [%~3]:"
  IF "!input!" EQU "" (
    GOTO :askAgain
  ) 
) else (
  SET /p "input=%~1 [null]: "
)   
SET "%~2=%input%"
EXIT /B 0

:getBaseDir fileName var
FOR /F "tokens=*" %%i IN (%~1) DO (
  SET "_line=%%i"
  IF "!_line:~0,2!" == "c:" (
    SET "_baseDir=!_line!"
    EXIT /B 0
  )
)
EXIT /B 1

:END
PAUSE
于 2012-09-12T21:17:21.340 に答える