テナントごとのデータベース パターンを使用した Azure SQL Database での SaaS アプリケーション内のスキーマの管理
適用対象: Azure SQL データベース
データベース アプリケーションの進化に伴って、データベース スキーマまたは参照データに対する変更が必然的に必要になります。 データベースのメンテナンス タスクも、定期的に必要です。 テナントごとのデータベース パターンを使用するアプリケーションの管理では、複数のテナント データベースにこれらの変更やメンテナンス タスクを適用する必要があります。
このチュートリアルでは、2 つのシナリオを扱います。すべてのテナントに対する参照データの更新のデプロイと、参照データを含むテーブルのインデックスの再構築です。 エラスティック ジョブ機能を使用して、すべてのテナント データベースと、新しいテナント データベースを作成するために使用されるテンプレート データベースに対してこれらのアクションを実行します。
このチュートリアルで学習する内容は次のとおりです。
- ジョブ エージェントを作成する
- T-SQL ジョブをすべてのテナント データベースに対して実行する
- すべてのテナント データベース内の参照データを更新する
- すべてのテナント データベース内のテーブルにインデックスを作成する
このチュートリアルを完了するには、次の前提条件を満たしておく必要があります。
- Wingtip Tickets SaaS Database Per Tenant アプリをデプロイします。 5 分未満でデプロイするには、テナントごとのデータベースを使用する Wingtip Tickets SaaS アプリケーションのデプロイと探索に関する記事を参照してください。
- Azure PowerShell がインストールされている。 詳しくは、「Azure PowerShell を使ってみる」をご覧ください。
- 最新バージョンの SQL Server Management Studio (SSMS) のインストール。 SSMS をダウンロードしてインストールします。
SaaS スキーマ管理パターンの概要
テナントごとのデータベース パターンは、テナントのデータを効率的に分離しますが、管理して維持するデータベースの数を増やします。 エラスティック ジョブは、複数のデータベースの管理を容易にします。 このジョブを使用して、データベースのグループに対して、タスク (T-SQL スクリプト) を安全かつ確実に実行できます。 ジョブにより、スキーマと一般的な参照データの変更を、アプリケーションのすべてのテナント データベースにわたってデプロイできます。 エラスティック ジョブを使用して、新しいテナントの作成に使用される "テンプレート" データベースを管理して、スキーマと参照データを常に最新の状態に保つこともできます。
エラスティック ジョブ
2024 年に、エラスティック ジョブは新機能を備えた一般提供製品としてリリースされました。 Azure SQL データベースの統合機能については、エラスティック データベース ジョブに関するページを参照してください。
テナントごとのデータベースを使用する Wingtip Tickets SaaS アプリケーションのスクリプトの入手
アプリケーションのソース コードと管理スクリプトは、WingtipTicketsSaaS-DbPerTenant GitHub リポジトリから入手できます。 Wingtip Tickets SaaS スクリプトをダウンロードし、ブロックを解除する手順については、一般的なガイダンスに関する記事をご覧ください。
ジョブ エージェント データベースと新しいジョブ エージェントの作成
このチュートリアルでは、PowerShell を使用してジョブ エージェントとバッキング ジョブ エージェント データベースを作成する必要があります。 ジョブ エージェント データベースは、ジョブの定義、ジョブの状態、および履歴を保持します。 ジョブ エージェントとそのデータベースを作成したら、すぐにジョブを作成して監視できます。
- PowerShell ISE で、…\Learning Modules\Schema Management\Demo-SchemaManagement.ps1 を開きます。
- F5 キーを押して、スクリプトを実行します。
Demo-SchemaManagement.ps1 スクリプトでは、Deploy-SchemaManagement.ps1 スクリプトが呼び出されて、カタログ サーバーに osagent という名前のデータベースが作成されます。 次に、このデータベースをパラメーターとして使用して、ジョブ エージェントを作成します。
新しい参照データをすべてのテナントにデプロイするジョブの作成
Wingtip Tickets アプリでは、各テナント データベースに、サポートされている一連の会場の種類が含まれています。 各会場には、ホストできるイベントの種類を定義し、アプリで使用される背景画像を決定する特定の会場の種類があります。 新しい種類のイベントをサポートするアプリケーションでは、この参照データを更新して、新しい会場の種類を追加する必要があります。 この演習では、すべてのテナント データベースに更新をデプロイして、2 つの会場タイプMotorcycle Racing と Swimming Club を追加します。
最初に、各テナント データベースに含まれている会場の種類を確認します。 SQL Server Management Studio (SSMS) でテナント データベースの 1 つに接続し、VenueTypes テーブルを調べます。 このテーブルは、データベース ページからアクセスする Azure Portal のクエリ エディターでクエリを実行することもできます。
- SSMS を開き、テナント サーバー tenants1-dpt-<ユーザー>.database.windows.net に接続します。
- 現在、Motorcycle Racing および Swimming Club が含まれていないことを確認するために、tenants1-dpt-<ユーザー> サーバーの contosoconcerthall データベースを参照し、VenueTypes テーブルに対してクエリを実行します。
それでは、すべてのテナント データベースの VenueTypes テーブルを更新するジョブを作成し、新しい会場の種類を追加してみましょう。
新しいジョブを作成するには、ジョブ エージェントの作成時に jobagent データベース内に作成された一連のジョブ システム ストアド プロシージャを使用します。
- SSMS で、カタログ サーバー catalog-dpt-<ユーザー>.database.windows.net サーバーに接続します
- SSMS で、ファイル ...\Learning Modules\Schema Management\DeployReferenceData.sql を開きます
- ステートメントを次のように変更します:SET @wtpUser = <ユーザー>。ユーザーの値は、Wingtip Tickets SaaS Database Per Tenant アプリをデプロイしたときに使用したユーザーの値に置き換えます
- jobagent データベースに接続していることを確認し、F5 キーを押してスクリプトを実行します。
DeployReferenceData.sql スクリプトで、次の要素を確認します。
- sp_add_target_group は、DemoServerGroup という名前のターゲット グループを作成します。
- sp_add_target_group_member は、ターゲット データベースのセットを定義するために使用されます。 最初に tenants1-dpt-<ユーザー> サーバーが追加されます。 ターゲットとしてサーバーを追加すると、ジョブの実行時にそのサーバーに存在するデータベースがジョブに含まれるようになります。 その後、basetenantdb データベースと adhocreporting データベース (後のチュートリアルで使用されます) がターゲットとして追加されます。
- sp_add_job は、Reference Data Deployment という名前のジョブを作成します。
- sp_add_jobstep は、T-SQL コマンド テキストを含むジョブ ステップを作成して、参照テーブル VenueTypes を更新します。
- スクリプトの残りのビューは、オブジェクトの存在を表示し、ジョブの実行を監視します。 これらのクエリを使用して lifecycle 列の状態値を調べ、すべてのターゲット データベースでジョブがいつ終了したかを確認します。
スクリプトが完了したら、参照データが更新されていることを確認できます。 SSMS で、tenants1-dpt-<ユーザー> サーバーの contosoconcerthall データベースを参照し、VenueTypes テーブルに対してクエリを実行します。 Motorcycle Racing と Swimming Club が存在していることを確認します。
参照テーブルのインデックスを管理するジョブの作成
この演習では、参照テーブルの主キーにインデックスを再構築するジョブを使用します。 これは、大量のデータを読み込んだ後に実行される一般的なデータベース メンテナンス操作です。
同じジョブ 'システム' ストアド プロシージャを使用したジョブの作成
- SSMS を開き、catalog-dpt-<ユーザー>.database.windows.net サーバーに接続します
- …Learning ModulesSchema ManagementOnlineReindex.sql ファイルを開きます
- 右クリックして [接続] を選択し、catalog-dpt-<ユーザー>.database.windows.net サーバーに接続します (まだ接続していない場合)。
- jobagent データベースに接続していることを確認し、F5 キーを押してスクリプトを実行します。
OnlineReindex.sql スクリプトで次の要素を確認します。
- sp_add_job は、"Online Reindex PK__VenueTyp__265E44FD7FD4C885" という新しいジョブを作成します
- sp_add_jobstep は、T-SQL コマンド テキストを含むジョブ ステップを作成して、インデックスを更新します
- スクリプトの残りのビューは、ジョブの実行を監視します。 これらのクエリを使用して lifecycle 列の状態値を調べ、すべてのターゲット グループ メンバーでジョブがいつ正常に終了したかを確認します。
次のステップ
このチュートリアルで学習した内容は次のとおりです。
- 複数のデータベースで T-SQL ジョブを実行するジョブ エージェントを作成する
- すべてのテナント データベース内の参照データを更新する
- すべてのテナント データベース内のテーブルにインデックスを作成する
次は、アドホック レポートのチュートリアルを試して、テナント データベース間で実行されている分散クエリを確認してください。