SQL Server ベースの環境に対しての CI/CD で活用できるツールとして SqlPackage があります。
Visual Studio Code の Dev Container (開発コンテナー) 上に SqlPackage の実行環境を作成しようかなと思って試してみました。
SqlPackage に問題がある場合は DacFx のリポジトリ から Issue で報告ができます。
Dev Container を使用した環境の構築
使用するイメージ
Dev Container の初期状態で利用可能なテンプレートは Available Dev Container Templates で公開されていますが、今回は Ubuntu のイメージを使用しています。
現時点の Ubuntu のイメージは 22.04.4 LTS が使用されていますので、各種インストールはこのバージョンに合わせて実行していきます。
SqlPackage のインストール
今回、SqlPackage をインストールして実施したいのが次のようとなります。
- 接続対象として指定した SQL Server ベースの環境で、オブジェクト単位で DDL のスクリプトを作成
- SDK スタイルのデータベースプロジェクトをビルドして dacpac を作成
- 作成した dacpac を使用して増分スクリプトを作成
SqlPackage はリリースされた当初は「/Action:Extract」(抽出) は「DACPAC」のみサポートしていましたが、19.1 SqlPackage から 「/p:ExtractTarget」をサポートし、SQL ファイルへの出力が可能となりました。
細かなスクリプト生成のオプションを指定する必要のある場合は、SMO を使用したスクリプト作成 の使用を検討する必要がありますが、データベース全体の基本的なスクリプト化であれば、SqlPackage でも対応することができそうです。
SqlPackage のインストールについては次のコマンドで実行可能です。
sudo apt-get update && sudo apt-get install -y dotnet-sdk-8.0 dotnet new install Microsoft.Build.Sql.Templates dotnet tool install -g microsoft.sqlpackage
インストールの方法は、 インストール、クロスプラットフォーム に記載されています。
最終的に SDK スタイルのデータベースプロジェクトのビルドも実行したいため、.NET SDK のインストールで SqlPackage を使用できるようにしています。
.NET SDK のインストールが完了すると、次のコマンドでデータベースプロジェクトを作成することができます。
dotnet new sqlproj -n dbproject -tp Sql160
作成したデータベースプロジェクトに次のコマンドを実行して、DDL の出力を行います。
constring="<接続文字列>" cd dbproject ~/.dotnet/tools/sqlpackage /action:extract /targetfile:./ddl /scs:$constring /p:extracttarget=schemaobjecttype
データベースプロジェクトに追加された DDL を使用して、次のコマンドで dacpac にビルドします。
dotnet build
データベースプロジェクト内のファイルで作成された dacpac については、次のようなコマンドを使用することで、増分スクリプトを作成することができます。
~/.dotnet/tools/sqlpackage /action:script /sf:./bin/Debug/dbproject.dacpac /tcs:$constring /OutputPath:out.sql /p:ScriptDatabaseOptions=False cat ./out.sql
このような流れが実行できると、SqlPackage を使用したデータベースプロジェクトの利用を確認することができるのではないでしょうか。
今回使用したスクリプトの全体はこちらになります。
sudo apt-get update && sudo apt-get install -y dotnet-sdk-8.0 dotnet new install Microsoft.Build.Sql.Templates dotnet tool install -g microsoft.sqlpackage dotnet new sqlproj -n dbproject -tp Sql160 constring="<接続文字列>" cd dbproject ~/.dotnet/tools/sqlpackage /action:extract /targetfile:./ddl /scs:$constring /p:extracttarget=schemaobjecttype dotnet build ~/.dotnet/tools/sqlpackage /action:script /sf:./bin/Debug/dbproject.dacpac /tcs:$constring /OutputPath:out.sql /p:ScriptDatabaseOptions=False cat ./out.sql