ほとんど静的なルックアップデータを含む巨大データベース(20GB +)がいくつかあります。アプリケーションはこれらのデータベースのテーブルに対して結合を実行するため、各開発者のローカルSQL Serverの一部である必要があります(つまり、中央の共有データベースサーバーでホストすることはできません)。
実際のSQL Serverデータベースファイル(* .mdfおよび* .ldf)の正規セットをコピーし、各開発者のローカルデータベースに添付する予定です。
ファイルを適切な場所にコピーできるように、ローカルのSQL Serverインスタンスのデータディレクトリを見つける最良の方法は何ですか?これは自動化されたプロセスを介して行われるため、ビルドスクリプトからそれを見つけて使用できるようにする必要があります。
データファイルとログファイルにデフォルトパスが設定されているかどうかによって異なります。
パスがProperties
=> Database Settings
=> Database default locations
で明示的に設定されている場合、SQLサーバーはDefaultData
およびDefaultLog
値のSoftware\Microsoft\MSSQLServer\MSSQLServer
に保存します。
ただし、これらのパラメーターが明示的に設定されていない場合、SQLサーバーはmasterデータベースのデータパスとログパスを使用します。
Bellowは両方のケースをカバーするスクリプトです。これは、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を使用して同じ結果を得ることができます。 Bellowは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')
これは非常に古いスレッドですが、簡単な解決策を提供する必要があると感じています。 Management Studioで、自動化されたスクリプトにアクセスしたいパラメーターがどこにあるかを知っている場合、最も簡単な方法は、スタンドアロンテストシステムでクイックプロファイラートレースを実行し、Management Studioがバックエンドで実行していることをキャプチャすることです。
この例では、デフォルトのデータとログの場所を見つけることに関心があると仮定すると、次のことができます。
- 選択する
SERVERPROPERTY( 'instancedefaultdatapath')AS [DefaultFile]、
SERVERPROPERTY( 'instancedefaultlogpath')AS [DefaultLog]
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
現在のデータベースでは、次のものを使用できます。
_select physical_name from
_ _sys.database_files;
_
別のデータベースを指定するには「モデル」、sys.master_filesを使用
select physical_name from sys.master_files where database_id = DB_ID(N'Model');
Sql Server 2012以降、次のクエリを使用できます。
SELECT SERVERPROPERTY('INSTANCEDEFAULTDATAPATH') as [Default_data_path], SERVERPROPERTY('INSTANCEDEFAULTLOGPATH') as [Default_log_path];
(これは http://technet.Microsoft.com/en-us/library/ms174396.aspx のコメントから取られ、テストされました。)
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'
シンプルに保つ:
use master
select DB.name, F.physical_name from sys.databases DB join sys.master_files F on DB.database_id=F.database_id
これにより、関連するファイルを持つすべてのデータベースが返されます
GUIから:サーバーのプロパティを開き、データベース設定に移動し、データベースのデフォルトの場所を参照してください。
データベースファイルは任意の場所にドロップできますが、デフォルトのディレクトリに保存する方がきれいに見えることに注意してください。
次の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'
「飛び散ったビット」の答えを拡張して、これを行う完全なスクリプトを次に示します。
@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
バックアップの復元は、簡単になりバージョン管理がサポートされるためです。参照データは、いつ有効になったかを知るために、特にバージョン管理する必要があります。デタッチアタッチはあなたにその能力を与えません。また、バックアップを使用すると、データベースをシャットダウンせずに、更新されたコピーを引き続き提供できます。
Alexの答え は正しいものですが、後世には別のオプションがあります。新しい空のデータベースを作成します。ターゲットディレクトリを指定せずにCREATE DATABASEを使用すると、デフォルトのデータ/ログディレクトリが取得されます。簡単です。
個人的には、しかし、私はおそらくどちらかだろう:
ps:2015年であっても20GBは巨大ではありません。しかし、それはすべて相対的なものです。
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インスタンスのデータディレクトリの検索方法 からダウンロードできます。
小さい選択:データフォルダーはなく、デフォルトデータフォルダーのみです。
とにかく、それを見つけるために、最初のデフォルトのインスタンス用にインストールしたい場合:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\Setup\SQLDataRoot
名前付きインスタンスがある場合、MSSQL.1はMSSQL10.INSTANCENAMEのようなものになります。