共有マルチテナント データベースを使用している 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 をインストール済みである必要があります。 スタンドアロンおよびテナントごとのデータベース バージョンでは、このチュートリアルはサポートされません。
  • 最新バージョンの 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 のデータベースを使用してジョブ定義、ジョブの状態、履歴を格納します。 ジョブ エージェントの作成後は、すぐにジョブを作成および監視することができます。

  1. PowerShell ISE で、…\Learning Modules\Schema Management\Demo-SchemaManagement.ps1 を開きます。
  2. F5 キーを押して、スクリプトを実行します。

Demo-SchemaManagement.ps1 スクリプトでは、Deploy-SchemaManagement.ps1 スクリプトが呼び出されて、カタログ サーバーに jobagent という名前のデータベースが作成されます。 次に、スクリプトはジョブ エージェントを作成し、jobagent データベースをパラメーターとして渡します。

新しい参照データをすべてのテナントにデプロイするジョブの作成

準備

各テナントのデータベースの VenueTypes テーブルには、一連の会場タイプが含まれています。 各会場タイプは、会場で開催できるイベントの種類を定義します。 これらの会場タイプは、テナント イベント アプリに表示される背景画像に対応しています。 この演習では、すべてのデータベースに更新をデプロイして、2 つの会場タイプMotorcycle RacingSwimming Club を追加します。

最初に、各テナント データベースに含まれている会場の種類を確認します。 SQL Server Management Studio (SSMS) でテナント データベースの 1 つに接続し、VenueTypes テーブルを調べます。 このテーブルは、データベース ページからアクセスする Azure Portal のクエリ エディターでクエリを実行することもできます。

  1. SSMS を開き、テナント サーバー tenants1-dpt-<user>.database.windows.net に接続します。
  2. 現在、Motorcycle RacingSwimming Club が含まれていないことを確認するには、contosoconcerthall サーバー上の tenants1-dpt-<user> データベースを参照し、VenueTypes テーブルに対してクエリを実行します。

手順

各テナント データベースの VenueTypes テーブルに 2 つの新しい会場タイプを追加してテーブルを更新するジョブを作成します。

新しいジョブを作成するには、jobagent データベースに作成された一連のジョブ システム ストアド プロシージャを使用します。 ジョブ エージェントの作成時に、ストアド プロシージャが作成されました。

  1. SSMS で、テナント サーバー tenants1-mt-<user>.database.windows.net に接続します。

  2. tenants1 データベースを参照します。

  3. VenueTypes テーブルのクエリを実行して、Motorcycle RacingSwimming Club が結果の一覧に含まれていないことを確認します。

  4. カタログ サーバー catalog-mt-<user>.database.windows.net に接続します。

  5. カタログ サーバーの jobagent データベースに接続します。

  6. SSMS で、ファイル ...\Learning Modules\Schema Management\DeployReferenceData.sql を開きます。

  7. ステートメント set @User = <user> を変更し、Wingtip Tickets SaaS Multi-tenant Database アプリケーションをデプロイしたときに使用した User の値に置き換えます。

  8. F5 キーを押して、スクリプトを実行します。

確認

DeployReferenceData.sql スクリプトで、次の項目を確認します。

  • sp_add_target_group は、ターゲット グループ名 DemoServerGroup を作成し、ターゲット メンバーをグループに追加します。

  • _add_target_group_member は、次の項目を追加します。

    • server ターゲット メンバー タイプ。
      • これは、テナント データベースを含む tenants1-mt-<user> サーバーです。
      • サーバーの組み込みには、ジョブが実行された時点で存在するテナント データベースを含みます。
    • catalog-mt-<user> サーバーにある、テンプレート データベース (basetenantdb) の database ターゲット メンバー タイプ。
    • 後のチュートリアルで使用する adhocreporting データベースを含めるための database ターゲット メンバー タイプ。
  • sp_add_job は、Reference Data Deployment というジョブを作成します。

  • sp_add_jobstep では、T-SQL コマンド テキストを含むジョブ ステップを作成し、参照テーブル VenueTypes を更新します。

  • スクリプトの残りのビューは、オブジェクトの存在を表示し、ジョブの実行を監視します。 これらのクエリを使用して lifecycle 列の状態値を調べ、ジョブがいつ終了したかを確認します。 ジョブは、テナント データベースを更新し、参照テーブルを含む 2 つの追加のデータベースを更新します。

SSMS で、tenants1-mt-<user> サーバーのテナント データベースを参照します。 VenueTypes テーブルのクエリを実行して、Motorcycle RacingSwimming Club がテーブルに追加されたことを確認します。 会場タイプの総数が 2 つ増えているはずです。

参照テーブルのインデックスを管理するジョブの作成

この演習では、すべてのテナント データベースで参照テーブルの主キーにインデックスを再構築するジョブを作成します。 インデックスの再構築は、管理者が大量のデータを読み込んだ後でパフォーマンス向上のために実行できる一般的なデータベース管理操作です。

  1. SSMS で、catalog-mt-<user>.database.windows.net サーバーの jobagent データベースに接続します。

  2. SSMS で、...\Learning Modules\Schema Management\OnlineReindex.sql を開きます。

  3. F5 キーを押して、スクリプトを実行します。

確認

OnlineReindex.sql スクリプトで次の項目を確認します。

  • sp_add_jobは、Online Reindex PK__VenueTyp__265E44FD7FD4C885 という新しいジョブを作成します。

  • sp_add_jobstep は、T-SQL コマンド テキストを含むジョブ ステップを作成して、インデックスを更新します。

  • スクリプトの残りのビューは、ジョブの実行を監視します。 これらのクエリを使用して lifecycle 列の状態値を調べ、すべてのターゲット グループ メンバーでジョブがいつ正常に終了したかを確認します。

その他のリソース

次のステップ

このチュートリアルで学習した内容は次のとおりです。

  • 複数のデータベースにわたって T-SQL ジョブを実行するジョブ エージェントを作成する
  • すべてのテナント データベース内の参照データを更新する
  • すべてのテナント データベース内のテーブルにインデックスを作成する

次は、アドホック レポートのチュートリアルを試して、テナント データベース間で実行されている分散クエリを確認してください。