miso_soup3 Blog

主に ASP.NET 関連について書いています。

データベースプロジェクトにて、非スキーマスクリプトを管理する方法

問題

チーム内でのデータベース管理に、データベースプロジェクトを利用しています。

ですが、よくあるマスタデータの挿入については、手作業で管理をしていました。
Insert文を書いたクエリファイルを、共有フォルダに置くなり、メールに添付するなりして、
「このファイル実行しておいてねー」とチームで共有していました…。

これでは実行が面倒ですし、新しくデータベースを作成する際に、手間がかかります。
マスタデータなどの重要なスクリプトが、バージョン管理されていないのも問題です。

解決方法

データベースプロジェクトには、最初から配置前・配置後スクリプトが準備されています。(中身は空です。)
その配置後スクリプトに、マスタデータ挿入スクリプトを追加します。

これで、バージョン管理が可能になり、配置の際にスクリプトを実行してくれます。

データベースプロジェクトとは

VisualStudio 2010 の標準プロジェクトテンプレートです。
機能は

  • データベースをバージョン管理できる
  • 他の人が変更した内容を、自分のローカル環境に簡単に反映できる
  • 配置済のデータベースと、プロジェクトのデータベースの差分をスクリプトとして生成してくれたりする
  • etc...

などがあります。
データベース プロジェクトの概要

全体の流れ

マスタデータ挿入などの非スキーマスクリプトを、”配置後スクリプト”に記述します。
記述した後、配置を行います。結果として、データベースにマスタデータが挿入されます。

配置後スクリプト

1. スクリプトを作成する

データベースプロジェクトには、Scriptフォルダがあります。

  • Post-Deploymentフォルダ→配置後スクリプトを置く場所、
  • Pre-Deploymentフォルダ→配置前スクリプトを置く場所

各フォルダには、すでに空のスクリプトファイルが追加されています。

配置後に実行して欲しいスクリプトを、追加します。
今回は、Post-DeploymentフォルダのMasterフォルダに、Genders.sqlを追加しました。

2.実行スクリプトを指定する

追加しただけでは実行してくれません。
Script.PostDeployment.sqlに先程追加したスクリプトのファイル名を記述します。

sqlcmdなので、エラーがでるかもしれません。
データ>Transact-Sqlデータ>SQL CMDモードを選択するとおさまります。

Transact-SQL エディタでの SQLCMD スクリプトの編集

3.完了!配置!

これで、配置後スクリプトの準備は完了です!
配置をして、データが挿入されるのを確認します。

生成された配置スクリプトの最後には、先ほどのスクリプトが書かれています。

だが断る

...が、このままでは問題があります。
配置は、スキーマ変更の際などで頻繁に実行されるものです。
一方、マスタデータの挿入は、1回実行されれば充分です。

特にマスタデータは一意制約がある場合がほとんど。
2回目の配置からは、エラーがおきます。

解決方法は2つあります。

  • 1. 2度目は実行しないスクリプト、再実行スクリプトとしてSQLをかく
  • 2. スクリプト自体を実行しないようにする

…新規プロジェクトでは可能かもしれませんが、1.はほぼ無理です。

マイクロソフトチームの解決方法

VisualStudioホワイトペーパーの、
データベースプロジェクトガイト日本語の93ページによると、
日付を基準に、スクリプトの追加を制御するルーチンを開発して解決したそうです。

…そんなんできん…

ということで、私の場合は、チームの方にお願いして、
コメントアウトで制御することにしました。

おしまい

他に良い方法がありましたら、教えて下さい。お願いします。

今日の内容は、
データベースプロジェクトガイト日本語
89ページ〜93ページに、とてもわかりやすく載っています!

明日は朝飛行機でWDDに向かいます!ヽ(゚∀゚)ノ ワー