きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

SSDTの「スナップショット プロジェクト」機能は割と使える気がしました

私はSSDT(SQL Server Data Tools)を普段から使っているのですが、多機能なこともあり普段使ってない機能はまったく触れずに過ごしています。そのため、”実はよく知らない機能”がまだまだあります。

先日不意に、ソリューションエクスプローラーのコンテキストメニューの上のほうにいつも表示されている『スナップショット プロジェクト』ってなんやねん、というのが気になってしまったので、どんな機能か少し試してみました。

f:id:kiyokura:20160606232232p:plain

 

機能の説明

「スナップショット プロジェクト」機能が何をするかについては、以下がすべてのようです。

  • 現在のデータベースプロジェクトのオブジェクトの定義情報のスナップショットを取得する
  • 取得したスナップショットはdacpacファイルで保存される

……そのまんまです。

実際にやってみると、ソリューションエクスプローラ内にSnapshotフォルダが作成され、その中にタイムスタンプ付きのファイル名でdacpacファイルが作成されました。

f:id:kiyokura:20160606232440p:plain

 

ちなみにdacpacファイルですが、ざっくいえばデータベースのオブジェクト定義情報をXML形式で記録してzipで固めたファイルです。 詳しくは以下のMSDNドキュメントを見てみてください:データ層アプリケーション

 

何が嬉しいの?

この機能、前述のとおりプロジェクトのソースコードの現時点のスナップショットファイルが作成されるだけ、といえばそれだけです。もしソースコードのバージョン管理を何もやっていないのであれば、これは有効なソリューションかもしれません。しかしSSDTを利用して開発しているのであれば、通常は何らかのVCS*1を利用しているケースが多いはずです。であるなら、この機能はあまりうまみが無いように思いました。

 

ですが、少し触ってみると、利点も見えてきました。 個人的に感じた一番の利点は、「スキーマ比較機能で簡単に比較・差分更新が出来る」という点です。

SSDTのスキーマ比較機能は、プロジェクトやデータベースインスタンスなどのスキーマ同士を比較し、差分の検出や差分を埋めるための更新(スクリプトの生成と実行)を行ってくれる非常に便利な機能です。このスキーマ比較では、比較のソースとしてプロジェクトやデータベースインスタンスのほかに、『データ層アプリケーションファイル』、すなわちdacpacファイルががそのまま利用できます。

f:id:kiyokura:20160606233357p:plain

この機能とスナップショットを組み合わせると、任意のタイミングのスナップショットと現状のスキーマを比較して、「特定のオブジェクトだけ変更を元に戻す」というような操作も簡単にできます。

もちろんVSCを利用してバージョン管理されていれば、変更履歴から戻すことは可能です。しかし、(コミットの粒度やツールなどにも依存するとは思いますが)一度コミットした変更を履歴をさかのぼって戻すのはそれなりに煩雑だったりしますし、コミット全体ではなく『特定のオブジェクトの変更のみを戻したい』という場合にはさらに面倒になるかもしれません。

 

利用シーン(?)

全体的な作業の進め方によっても利用シーンは変わってくるとは思いますが、例えば以下のような使い方が出来るように思います(VCSとしてgitを想定しています)。

  1. 作業ブランチを作成してチェックアウト
  2. とりあえずスナップショットを作成
  3. 試行錯誤しながら作業(必要があればスナップショットから戻したりし再度スナップショットをとったりしつつ)
  4. ある程度作業がまとまったらコミット、マージ

なお、あらかじめ.gitignoreを利用するなどして、スナップショットファイルがリポジトリに含まれないようにしておくと楽な気がします*2

 

注意点

一つ注意しておかなければならないと思ったのは、『DBプロジェクトがエラーのない状態である必要がある』点です。dacpacが作成されるときに内部でビルドが行われるのですが、この際にエラーがあるとdacpacの生成に失敗します。 ですので、『いじっている最中でまだコンパイルがうまく通らない』という状態のDBオブジェクトがある場合はスナップショットが作成できません。

 

まとめ

SSDTの「スナップショット プロジェクト」機能はシンプルな機能ですが、作業の進め方によっては十分に便利な機能です。VCSによるバージョン管理とも決して排他ではなく、組み合わせることでより便利で柔軟な開発作業を行う道具として利用できる可能性がある機能だと思いました。

*1:version control system, gitとかtfsとかsvnとか……

*2:スナップショットを追加するとsqlprojファイルにも変更がかかったように見えますが、dacpacのエントリが追加されているわけではないようです