共有マルチテナント データベースを使用している SaaS アプリケーションでのスキーマの管理
適用対象: Azure SQL データベース
このチュートリアルでは、サービスとしてのソフトウェア (SaaS) アプリケーションで、データベース フリートを保持する際の課題について考察します。 データベースのフリート間でスキーマの変更を展開するための、ソリューションが示されています。
他のアプリケーションと同様に、Wingtip Tickets SaaS アプリは時間の経過に従って進化し、データベースへの変更が必要になる場合があります。 変更では、スキーマまたは参照データに影響を与えたり、データベース メンテナンス タスクを適用したりする可能性があります。 テナント パターンごとのデータベースを使用している SaaS アプリケーションの場合、大規模になる可能性があるテナント データベースのフリート間で変更を調整する必要があります。 さらに、データベース プロビジョニング プロセスにこれらの変更を組み込み、新しいデータベースが作成されるときに確実に含まれるようにします。
2 つのシナリオ
このチュートリアルでは、次の 2 つのシナリオを考察します。
- 参照データの更新をすべてのテナントにわたってデプロイする。
- 参照データを含むテーブルのインデックスを再構築する。
これらの操作を複数のテナント データベースにわたって実行するために、Azure SQL Database のエラスティック ジョブ機能を使用します。 このジョブは、'テンプレート' テナント データベースに対しても機能します。 Wingtip Tickets サンプル アプリでは、新しいテナント データベースをプロビジョニングするために、このテンプレート データベースがコピーされます。
このチュートリアルで学習する内容は次のとおりです。
- ジョブ エージェントを作成する。
- 複数のテナント データベースで T-SQL クエリを実行する。
- すべてのテナント データベースで参照データを更新する。
- すべてのテナント データベース内のテーブルにインデックスを作成する。
前提条件
Wingtip Tickets マルチテナント データベース アプリが、既にデプロイされていること。
- 手順については、Wingtip Tickets SaaS マルチテナント データベース アプリケーションについて説明している最初のチュートリアル、
「Azure SQL Database を使用するシャード化されたマルチテナント アプリケーションのデプロイと操作」をご覧ください。- デプロイ プロセスは 5 分未満で実行されます。
- シャード化されたマルチテナント バージョンの Wingtip をインストール済みである必要があります。 スタンドアロンおよびテナントごとのデータベース バージョンでは、このチュートリアルはサポートされません。
- 手順については、Wingtip Tickets SaaS マルチテナント データベース アプリケーションについて説明している最初のチュートリアル、
最新バージョンの SQL Server Management Studio (SSMS) がインストールされている必要があります。 「SSMS のダウンロードとインストール」をご覧ください。
Azure PowerShell がインストールされている必要があります。 詳細については、「Azure PowerShell を使ってみる」をご覧ください。
SaaS スキーマ管理パターンの概要
このサンプルで使用されているシャード化されたマルチテナント データベース モデルでは、テナント データベースに 1 つまたは複数のテナントを含めることができます。 このサンプルでは、複数テナントのデータベースと 1 テナント のデータベースを組み合わせてハイブリッド テナント管理モデルを実現する可能性を探ります。 これらのデータベースへの変更の管理は、複雑になる場合があります。 エラスティック ジョブは、大規模数のデータベースの管理をに使用されます。 ジョブにより、テナント データベースのグループに対して、Transact-SQL スクリプトをタスクとして安全かつ確実に実行できます。 このタスクはユーザーの操作や入力に依存しません。 この方法を使用して、スキーマや共通の参照データに対する変更を、アプリケーションのすべてのテナントにわたってデプロイできます。 エラスティック ジョブは、データベースのゴールデン テンプレートのコピーを保持するためにも使用できます。 このテンプレートは新しいテナントの作成に使用され、常に最新のスキーマと参照データが使用されるようにします。
エラスティック ジョブ
2024 年に、エラスティック ジョブは新機能を備えた一般提供製品としてリリースされました。 Azure SQL データベースの統合機能については、エラスティック データベース ジョブに関するページを参照してください。
Wingtip Tickets SaaS マルチテナント データベース アプリケーションのソース コードとスクリプトを入手する
Wingtip Tickets SaaS マルチテナント データベースのスクリプトとアプリケーション ソース コードは、GitHub の WingtipTicketsSaaS-MultitenantDB リポジトリで入手できます。 Wingtip Tickets SaaS のスクリプトをダウンロードしてブロックを解除する手順については、一般的なガイダンスに関する記事をご覧ください。
ジョブ エージェント データベースと新しいジョブ エージェントの作成
このチュートリアルでは、PowerShell を使用してジョブ エージェント データベースとジョブ エージェントを作成する必要があります。 SQL Agent で使用される msdb
データベースと同様に、ジョブ エージェントでは Azure SQL Database のデータベースを使用してジョブ定義、ジョブの状態、履歴を格納します。 ジョブ エージェントの作成後は、すぐにジョブを作成および監視することができます。
- PowerShell ISE で、…\Learning Modules\Schema Management\Demo-SchemaManagement.ps1 を開きます。
- F5 キーを押して、スクリプトを実行します。
Demo-SchemaManagement.ps1 スクリプトでは、Deploy-SchemaManagement.ps1 スクリプトが呼び出されて、カタログ サーバーに jobagent
という名前のデータベースが作成されます。 次に、スクリプトはジョブ エージェントを作成し、jobagent
データベースをパラメーターとして渡します。
新しい参照データをすべてのテナントにデプロイするジョブの作成
準備
各テナントのデータベースの VenueTypes
テーブルには、一連の会場タイプが含まれています。 各会場タイプは、会場で開催できるイベントの種類を定義します。 これらの会場タイプは、テナント イベント アプリに表示される背景画像に対応しています。 この演習では、すべてのデータベースに更新をデプロイして、2 つの会場タイプMotorcycle Racing と Swimming Club を追加します。
最初に、各テナント データベースに含まれている会場の種類を確認します。 SQL Server Management Studio (SSMS) でテナント データベースの 1 つに接続し、VenueTypes
テーブルを調べます。 このテーブルは、データベース ページからアクセスする Azure Portal のクエリ エディターでクエリを実行することもできます。
- SSMS を開き、テナント サーバー
tenants1-dpt-<user>.database.windows.net
に接続します。 - 現在、Motorcycle Racing と Swimming Club が含まれていないことを確認するには、
contosoconcerthall
サーバー上のtenants1-dpt-<user>
データベースを参照し、VenueTypes
テーブルに対してクエリを実行します。
手順
各テナント データベースの VenueTypes
テーブルに 2 つの新しい会場タイプを追加してテーブルを更新するジョブを作成します。
新しいジョブを作成するには、jobagent
データベースに作成された一連のジョブ システム ストアド プロシージャを使用します。 ジョブ エージェントの作成時に、ストアド プロシージャが作成されました。
SSMS で、テナント サーバー
tenants1-mt-<user>.database.windows.net
に接続します。tenants1
データベースを参照します。VenueTypes
テーブルのクエリを実行して、Motorcycle Racing と Swimming Club が結果の一覧に含まれていないことを確認します。カタログ サーバー
catalog-mt-<user>.database.windows.net
に接続します。カタログ サーバーの
jobagent
データベースに接続します。SSMS で、ファイル ...\Learning Modules\Schema Management\DeployReferenceData.sql を開きます。
ステートメント
set @User = <user>
を変更し、Wingtip Tickets SaaS Multi-tenant Database アプリケーションをデプロイしたときに使用した User の値に置き換えます。F5 キーを押して、スクリプトを実行します。
確認
DeployReferenceData.sql スクリプトで、次の項目を確認します。
sp_add_target_group は、ターゲット グループ名 DemoServerGroup を作成し、ターゲット メンバーをグループに追加します。
_add_target_group_member は、次の項目を追加します。
- server ターゲット メンバー タイプ。
- これは、テナント データベースを含む
tenants1-mt-<user>
サーバーです。 - サーバーの組み込みには、ジョブが実行された時点で存在するテナント データベースを含みます。
- これは、テナント データベースを含む
catalog-mt-<user>
サーバーにある、テンプレート データベース (basetenantdb
) の database ターゲット メンバー タイプ。- 後のチュートリアルで使用する
adhocreporting
データベースを含めるための database ターゲット メンバー タイプ。
- server ターゲット メンバー タイプ。
sp_add_job は、Reference Data Deployment というジョブを作成します。
sp_add_jobstep では、T-SQL コマンド テキストを含むジョブ ステップを作成し、参照テーブル
VenueTypes
を更新します。スクリプトの残りのビューは、オブジェクトの存在を表示し、ジョブの実行を監視します。 これらのクエリを使用して lifecycle 列の状態値を調べ、ジョブがいつ終了したかを確認します。 ジョブは、テナント データベースを更新し、参照テーブルを含む 2 つの追加のデータベースを更新します。
SSMS で、tenants1-mt-<user>
サーバーのテナント データベースを参照します。 VenueTypes
テーブルのクエリを実行して、Motorcycle Racing と Swimming Club がテーブルに追加されたことを確認します。 会場タイプの総数が 2 つ増えているはずです。
参照テーブルのインデックスを管理するジョブの作成
この演習では、すべてのテナント データベースで参照テーブルの主キーにインデックスを再構築するジョブを作成します。 インデックスの再構築は、管理者が大量のデータを読み込んだ後でパフォーマンス向上のために実行できる一般的なデータベース管理操作です。
SSMS で、
catalog-mt-<user>.database.windows.net
サーバーのjobagent
データベースに接続します。SSMS で、...\Learning Modules\Schema Management\OnlineReindex.sql を開きます。
F5 キーを押して、スクリプトを実行します。
確認
OnlineReindex.sql スクリプトで次の項目を確認します。
sp_add_job
は、Online Reindex PK__VenueTyp__265E44FD7FD4C885 という新しいジョブを作成します。sp_add_jobstep
は、T-SQL コマンド テキストを含むジョブ ステップを作成して、インデックスを更新します。スクリプトの残りのビューは、ジョブの実行を監視します。 これらのクエリを使用して
lifecycle
列の状態値を調べ、すべてのターゲット グループ メンバーでジョブがいつ正常に終了したかを確認します。
その他のリソース
次のステップ
このチュートリアルで学習した内容は次のとおりです。
- 複数のデータベースにわたって T-SQL ジョブを実行するジョブ エージェントを作成する
- すべてのテナント データベース内の参照データを更新する
- すべてのテナント データベース内のテーブルにインデックスを作成する
次は、アドホック レポートのチュートリアルを試して、テナント データベース間で実行されている分散クエリを確認してください。