ReadyRoll Core
Visual Studio 2017 Enterpriseには、RedGate社のReadyRollという、SQL Serverに対して構成の履歴や差分を比較するためのツールが付属しています(Proにはついていません)。フルライセンスはOracleに対応したり、より高度なことができるのですが、Visual Studio 2017にはCoreエディションという機能制限版となっています。
SSDTと何が違うの?ということですが、FAQに載っています。
SSDTはステートベース、ReadyRollはマイグレーションファースト、という説明で方向性が違う…らしいです。まだ私も使いこんでないので、ありがたい状況がよくわかってません。誤解を恐れずに言えば、EntityFrameworkのマイグレーションと同じことができると。単純なシナリオならSSDTでも問題ない、と書いていますね。
Octopus Deployと組み合わせることにより、複数のデータベースへのデプロイ、ロールバックも対応しています。
Proバージョン
Visual Studio 2017に付属しているのはCore Editionなので、機能が結構制限されています。制限されているリスト(上のURLにも載っています)。
- Work quickly and efficiently with code-based objects e.g. stored procedures (Programmable Objects feature)
- Offline Schema Model for object-level history
- Include static data alongside schema changes
- Customize schema and data comparison options
- Customize schema comparison filters
- Generate a diff report of database changes
- Generate a schema drift report
- Generate a schema drift correction script
- Easy deployment of CLR database objects
- Visual Studio 2012/2013/2015 All Edition Support
VS Enterpriseで試してよさそうなら使ってみてもいいと思います。
継続的インテグレーション時の注意点
Visual Studio単体でビルド&デプロイするときはいいのですが、VSTSやTFSなどで継続的インテグレーションを実行するとエラーになります。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\ReadyRoll\ReadyRoll.Data.Schema.SSDT.targets(145,5): Error : An error occurred while attempting to verify your deployment scripts: A connection was successfully established with the server, but then an error occurred during the login process. (provider: Named Pipes Provider, error: 0 - No process is on the other end of the pipe.)
原因はsqlprojファイルのReadyRollTargetPathがpackagesフォルダを参照していないためです。以下の手順で対処してください。
- ReadyRollプロジェクトを右クリックして、「アンロード」を選択。
- プロジェクトファイルが「利用不可」になるので、右クリックして、「編集」
- ReadyRollTargetsPath というセクションを探して、以下のように編集。
<ReadyRollTargetsPath Condition="Exists('$(MSBuildThisFileDirectory)..\packages')">$([System.IO.Directory]::GetDirectories('$(MSBuildThisFileDirectory)..\packages', 'ReadyRoll.MSBuild.*')[0])\tools\ReadyRoll.Data.Schema.SSDT.targets</ReadyRollTargetsPath>
これで、sqlprojファイルを保存して、プロジェクトを右クリックから「再読み込み」してください。コミットすればVSTS/TFSでビルドできるはずです。これ実はチュートリアルには書いてなくて、ビルドの設定のところに書かれています。
https://documentation.red-gate.com/display/RR1/Build+components
注意点として、ドキュメントにも書かれていますが、ソリューションファイル(sln)が「親フォルダにない場合」このままコピペでは動きません(Visual Studioから普通に作ったら親フォルダにslnがあります)。..\packages のところを適切に変更してください。