データベースのビルドおよび配置の概要
データベース プロジェクトからデータベース サーバーに、データベースを作成する場合や、既存のデータベースに対する更新を発行する場合は、データベース プロジェクトをビルドしてから、データベース サーバーに配置する必要があります。 ビルド ステップでは、データベース プロジェクトが、配置に使用するファイルにコンパイルされます。 これらのファイルには、.dbschema ファイル、.deploymentmanifest ファイル、配置前スクリプト、および配置後スクリプトが含まれます。 データベース プロジェクトをビルドするとき、ターゲット データベースとの比較は行われません。 データベース プロジェクトを配置するときに、ビルド アクションの出力がターゲット データベース (存在する場合) と比較され、配置スクリプトが生成されます。 設定に応じて、スクリプトがターゲット データベースに配置されます。 また、配置スクリプトを生成し、ステージング サーバーまたは運用サーバーに配置する前にスクリプトを変更することもできます。 クリーン ビルド アクションでは、スクリプト、配置マニフェスト、.dbschema ファイルなどの既存のビルド成果物が削除されます。
配置のスクリプト
ターゲットを作成または更新するスクリプトの前後に、実行されるスクリプトを作成できます。 使用できるのは 1 つの配置前スクリプトと 1 つの配置後スクリプトのみですが、これらのスクリプト内から他のスクリプトを含めることもできます。 詳細については、「シナリオ: データベース スクリプトの作成および変更」を参照してください。
既存データベースへの変更の配置に関する考慮事項
変更を既存のデータベースに配置するときに、一部の変更によってデータが失われる可能性があります。 変更によってテーブルに含まれるデータが損失する可能性がある場合、[データ損失が発生する場合に増分配置をブロック] チェック ボックスをオンにしておくと、配置がキャンセルされます。 このチェック ボックスは既定でオンになっていますが、プロジェクトのプロパティ ウィンドウで設定できます。 詳細については、「データベース プロジェクト設定の概要」を参照してください。 データ損失が発生する変更の例としては、テーブルを削除して再作成した場合、列のサイズを変更した場合 (char(100) から char(50)、または nchar(100) から char(100))、文字型列の照合順序を変更した場合などが挙げられます。
メモ : |
---|
リファクタリングを使用して、データベース オブジェクトの名前を変更したりデータベース オブジェクトを別のスキーマに移動したりすると、リファクタリング ログ ファイルにそのアクションが記録されます。 配置時には、ログ ファイルの情報が変更の意図を保持するのに役立ちます。 たとえば、テーブルの名前を変更した場合、テーブルが削除され、新しい名前でテーブルが作成されるため、データが失われる可能性があります。 リファクタリング ログ ファイルを使用すると、配置スクリプトによってテーブルの名前を変更し、変更の意図とデータを保持できます。 |
失敗した配置の回復
Visual Studio Team System Database Edition はトランザクション ログにセーブ ポイントを作成するため、配置が失敗した場合はそのセーブ ポイントに戻すことができます。 ただし、セーブポイントが作成されてからデータベースが戻されるまでの間に行われた配置において変更されたデータベース内のデータは、失われる可能性があります。 このため、配置前に共有データベースをシングルユーザー モードにし、バックアップしておくことを強くお勧めします。
メモ : |
---|
失敗した配置からデータベースを復元するには、完全復旧モデルを使用する必要があります。 単純復旧モデルはトランザクション ログが必要になるため、十分ではありません。 詳細については、Microsoft Web サイトの「復旧モデルの概要」を参照してください。 |
除外されたファイル
データベース プロジェクトからファイルを除外すると、そのファイル内で定義されているデータベース オブジェクトは、ビルドまたは配置には含まれません。 1 つ以上のオブジェクトを操作しているときに、既に完了した作業を配置するには、ファイルを除外して、準備ができている項目のみを配置します。 配置の準備ができたときにファイルを追加することで、既存のオブジェクト (プロジェクトで変更されていない場合) を変更しなくても、配置によりデータベースが新しいオブジェクトに更新されます。 詳細については、「 方法 : データベース プロジェクトからファイルを除外する」を参照してください。
重要 : |
---|
ターゲット データベースに存在するオブジェクトをデータベース プロジェクトから除外した後でプロジェクトを配置すると、データが失われる可能性があります。 配置構成の [ターゲット データベースにあってデータベース プロジェクトにないオブジェクトに対して DROP ステートメントを生成する] チェック ボックスがオンになっている場合、ターゲット データベースからそれらのオブジェクトが削除されます。 |
サーバー プロジェクト
サーバー プロジェクトには、"マスター" データベース内のオブジェクト用の定義が含まれます。 サーバー プロジェクトのターゲット データベースの名前は常に "master" になります。 サーバーの設定ごとに、サーバー プロジェクトの配置時にその設定の値を確認するかどうかを指定できます。 確認しない設定は無視されます。 サーバーの設定の値が、確認する設定の値と一致しない場合、配置は失敗してエラー メッセージが表示されます。
コマンド ライン ビルド
ビルド、配置、クリーンなどのアクションは、Visual Studio のユーザー インターフェイス内から実行する以外に、MSBuild.exe を使用してコマンド プロンプトで実行することもできます。 ターゲットのビルド アクションとして、Build、Deploy、Rebuild、Clean、SQLBuild、SQLDeploy、および CleanProject を指定できます。 既定では、ビルドおよび配置プロセスでは、データベース プロジェクト (.dbproj または .dbproj.user ファイル) 内で定義されているプロジェクト プロパティが使用されます。 ただし、これらのプロパティは、コマンド プロンプトまたは応答ファイル内からオーバーライドできます。
重要 : |
---|
コマンド ライン ビルドを実行する前に、Visual Studio を閉じる必要があります。 Visual Studio の実行中にコマンド ライン ビルドを実行すると、いくつかのエラーがキャッチされない可能性があります。 |
コマンド ラインの構文
次の例に示す構文を使用して、コマンド プロンプトでデータベース プロジェクトをビルドできます。
MSBuild /target:Build MySolutionName.sln
この例では、ソリューションに含まれるプロジェクト ファイルで指定されたプロジェクト プロパティを使用して、MySolutionName.sln という名前のソリューションでビルド アクションが実行されます。 ソリューションに複数のデータベース プロジェクトが含まれる場合、ソリューションに含まれるその他すべてのものと共にビルドされます。 ビルド アクションでは、ターゲット データベースの作成または更新に必要なスクリプトが生成されますが、そのスクリプトは配置されません。 特定のデータベース プロジェクトをビルドすることもできます。 Build ターゲットには、生成されたビルド スクリプトの配置前スクリプトおよび配置後スクリプトがインクルードされます。MSBuild /target:SQLBuild MyProjectName.dbproj
この例では、ビルドのみのアクションも実行されます。 この構文は、MyProjectName.dbproj という名前の単一のデータベース プロジェクトのみをビルドする場合に使用できます。 .dbproj ファイル内のプロジェクト プロパティは、ビルド スクリプトのアセンブルに使用されます。 スクリプトは配置されません。 SQLBuild ターゲットには、生成されたビルド スクリプトの配置前スクリプトまたは配置後スクリプトはインクルードされません。MSBuild /target:Build /p:BuildScriptName=MyScriptName.sql MyProjectName.dbproj
この例では、ビルドのみのアクションも実行されます。 この構文は、MyProjectName.dbproj という名前の単一のデータベース プロジェクトのみをビルドする場合に使用できます。 .dbproj ファイル内のプロジェクト プロパティは、ビルド スクリプトのアセンブルに使用されます。 コマンド ラインにより BuildScriptName プロパティがオーバーライドされ、出力スクリプトに別の名前が指定されます。 ビルド スクリプトを複数のサーバーに配置する場合は、この方法を使用できます。 スクリプトは配置されません。MSBuild /target:Deploy /property:TargetDatabase=UpdatedTargetDatabase;TargetConnectionString="Data Source=(local)\SQLEXPRESS;Integrated Security=True;Pooling=False" MyProjectName.dbproj
この例は、データベース プロジェクトを配置し、ターゲット データベース名と接続文字列をオーバーライドする方法を示しています。MSBuild /target:Deploy /p:DeploymentConfiguration=DeployPath\AlternateDeploymentConfiguration.deploymentconfig /p:SqlCommandVars=VarPath\AlternateVariables.sqlcmdvars /property:TargetDatabase=UpdatedTargetDatabase;TargetConnectionString="Data Source=(local)\SQLEXPRESS;Integrated Security=True;Pooling=False" MyProjectName.dbproj
この例は、データベース プロジェクトを配置し、別のターゲット データベースと接続文字列を指定し、配置構成と配置変数をオーバーライドする方法を示しています。MSBuild /target:Deploy /property:BuildScriptName= MyScriptName.sql /property:outdir=BuildScriptPath /property:TargetDatabase=UpdatedTargetDatabase;TargetConnectionString="Data Source=InstanceName\DatabaseName;Integrated Security=True;Pooling=False" ProjectPath\MyProjectName.dbproj
この例は、ビルドが発生するコンピュータとは別のコンピュータからデータベースを配置する方法を示しています。 たとえば、毎晩ビルド スクリプトを作成する中央のビルド コンピュータがある場合に、この構文を使用できます。 ビルド スクリプトの名前、ビルド スクリプトへのパス (outdir)、ターゲット データベース、およびデータベース プロジェクトのパスとファイル名を指定する必要があります。MSBuild @dbbuild.arf MyProjectName.dbproj
この例は、応答ファイルを使用してコマンド ライン引数を指定する方法を示しています。 ファイル dbbuild.arf には、プロジェクト プロパティをオーバーライドする引数など、MSBuild に使用できる引数を含めることができます。MSBuild /target:Rebuild MyProjectName.dbproj
この例では、前回ビルドされてから変更されていない場合でも、指定したプロジェクトまたはソリューションがリビルドされます。MSBuild /target:Clean MyProjectName.dbproj
この例は、既存のビルド スクリプトを削除する方法を示しています。 ほとんどの場合、別のビルドまたは配置アクションと共にこのアクションを実行します。
メモ : |
---|
/target: を /t:、/property: を /p: と省略できます。 |
詳細については、「MSBuild コマンド ライン リファレンス」を参照してください。
応答ファイルの詳細については、Microsoft Web サイトの「MSBuild 応答ファイル」を参照してください。
メモ : |
---|
MSBuild.exe を実行するには、Visual Studio コマンド プロンプトを使用するか、vsvars32.bat バッチ ファイルを実行する必要があります。 このバッチ ファイルは、%VS80COMNTOOLS% 環境変数で指定されたフォルダにあります。 |
プロジェクトのプロパティ
データベース プロジェクトおよびサーバー プロジェクトのプロパティには、プロジェクトのビルドおよび配置方法に影響するものもあります。 これらのプロパティは、データベース プロジェクト ファイルおよび .user ファイル内に格納されますが、コマンド プロンプトまたは応答ファイルでオーバーライドできます。 詳細については、「方法 : データベース プロジェクトおよびサーバー プロジェクトのビルド設定を構成する」および「方法 : データベース プロジェクトおよびサーバー プロジェクトの配置設定を構成する」を参照してください。
SQLCMD 変数のオーバーライド
MSBuild を使用してプロジェクトを配置するときに SQLCMD 変数をオーバーライドするには、次の手順を実行する必要があります。
オーバーライドする 1 つ以上の SQLCMD 変数を定義します。 詳細については、「方法 : データベース プロジェクトの変数を定義する」を参照してください。
それらの変数を、オブジェクト定義、配置前スクリプト、または配置後スクリプトで使用します。
それらの変数の定義を、データベース プロジェクト ファイルまたはサーバー プロジェクト ファイルに追加します。 たとえば、ConnectionString 変数を .dbproj ファイルに追加します。 まず、そのファイル内で次のコードを探します。
<!--Import the settings--> <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\TeamData\Microsoft.Data.Schema.SqlTasks.targets" /> <ItemGroup>
次に、<ItemGroup> ノードの上に次の定義を挿入します。
<Target Name="BeforeDeploy"> <ItemGroup> <ConnectionStringParts Include="$(TargetConnectionString)" /> </ItemGroup> <CreateProperty Value="@(ConnectionStringParts, '%3B')"> <Output TaskParameter="Value" PropertyName="EscapedConnectionString" /> </CreateProperty> <CreateItem Include="ConnectionString=$(EscapedConnectionString)"> <Output TaskParameter="Include" ItemName="SqlCommandVariableOverride" /> </CreateItem> </Target> <ItemGroup> <SqlCommandVariableOverride Include="ProjectDirectory=$(MSBuildProjectDirectory)" /> </ItemGroup>
メモ : |
---|
オーバーライドする変数は、SqlCommandVariableOverride という名前の項目として追加されます。 項目は使用中であるため、セミコロンを含むプロパティ (接続文字列など) に対して特別な処理を実行する必要があります。 MSBuild.exe では、セミコロンはリストとして解釈されます。 上記の例では、オーバーライド項目を作成する前に、BeforeDeploy ターゲットを使用して、接続文字列に含まれるセミコロンをエスケープしています。 |
参照
処理手順
チュートリアル : バージョン管理されたデータベースの新規作成と配置
チュートリアル: 既存のバージョン管理されたデータベースへの変更の配置