サブスクリプション クラスの記録の定義

サブスクリプション記録テーブルには、アプリケーションで使用するサブスクリプション データが格納されます。サブスクリプション記録テーブルは、たとえば、サブスクライバに配信された前回の通知に関する情報を格納して、前回の通知以降に着信したデータのみを基にして次回の通知を生成するのに使用します。

サブスクリプション記録の一般的な用途

サブスクリプション記録には、主として以前の通知に関するデータが格納されます。アプリケーションは、通知の生成時にこのデータを使用することにより、サブスクライバが前回の通知をいつ受け取ったか、またはサブスクライバが同様の通知を既に受信済みかどうかを判別できます。

サブスクリプション記録テーブルの適切な使用例として、期間内に各サブスクライバに配信する通知を 1 つのみに制限するアプリケーションが挙げられます。サブスクライバごとに 1 行を格納し、前回の通知の生成日時を表すタイムスタンプを持つサブスクリプション記録を定義できます。

通知を生成する際には、サブスクライバが過去 24 時間以内に通知を受け取っていない場合のみ通知を生成するという条件を指定できます。サブスクライバが最近通知を受け取っていない場合は、通知テーブルに通知を追加し、サブスクリプション記録のタイムスタンプを更新します。

サブスクリプション記録テーブル

サブスクリプション記録は、テーブルとして実装されます。サブスクリプション クラスを定義する際に、Transact-SQL の CREATE TABLE ステートメントを使用して、0 個以上の記録テーブルを定義できます。このステートメントでは、テーブル名、フィールド名、およびフィールドのデータ型を指定する必要があります。また、制約およびその他オプションの CREATE TABLE パラメータの引数を指定することもできます。CREATE INDEX ステートメントを含めることで、イベント記録テーブルにインデックスを作成できます。詳細については、「CREATE TABLE (Transact-SQL)」を参照してください。

サブスクリプション記録テーブルは、その他のサブスクリプション テーブルとは異なり、ユーザーがアプリケーションを更新した場合に、Notification Services によってテーブル名が自動的に変更されることがありません。同じ名前のテーブルが存在する場合、記録テーブルを作成するステートメントがエラーになります。INFORMATION_SCHEMA.TABLES ビューを使用して、同じ名前のテーブルが存在するかどうかを確認します。存在する場合は、テーブルの作成をスキップするか、または既存のテーブルを削除してからテーブルを再作成します。

次の例は、dbo.SubscriberHistory という名前の既存のテーブルを削除して、2 つの列 (SubscriberId および NotificationTime) を持つ StockSubscriptions サブスクリプション クラスの記録を作成する方法を示しています。

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = 'SubscriptionHistory'
        AND TABLE_SCHEMA = 'dbo')
    DROP TABLE dbo.SubscriberHistory;
CREATE TABLE dbo.SubscriberHistory
    ( 
    SubscriberId nvarchar(255), 
    LastNotified datetime 
    );
ms172554.note(ja-jp,SQL.90).gifメモ :
XML ファイルでアプリケーションを定義している場合、">" などの XML 予約文字をエンティティ参照で置き換える必要があります。詳細については、「XML の予約文字」を参照してください。

サブスクリプション記録テーブルを定義するには

XML でアプリケーションを定義している場合は、アプリケーション定義ファイル (ADF) で記録を定義します。プログラムでアプリケーションを定義している場合は、Notification Services 管理オブジェクト (NMO) を使用して記録を定義します。

サブスクリプション記録の更新

サブスクリプション記録テーブルのデータを操作するためのクエリを 1 つ以上定義できます。このクエリによって記録テーブルのデータが挿入、更新、および削除され、記録テーブルがアプリケーションでの使用に適した状態に保たれます。

サブスクリプション記録ルールを新しいイベント サブスクリプション ルールまたは定期的なサブスクリプション ルールに定義するか、または新しいサブスクリプション ルールの一部として定義する必要があります。

ms172554.note(ja-jp,SQL.90).gifメモ :
複数のイベント ルールまたは複数の定期的なルールの間では、実行順序が保証されません。

次のコードは、株価アプリケーションのサブスクリプション記録を更新する方法を示しています。このサブスクリプション記録は、各サブスクライバに対する前回の通知の生成日時を記録します。

UPDATE dbo.SubscriberHistory
SET LastNotified = GETUTCDATE() 
FROM dbo.StockSub s 
    JOIN dbo.SubscriberHistory h
        ON s.SubscriberId = h.SubscriberId
    JOIN dbo.EventChron ec 
        ON ec.Updated > h.LastNotified;

このルールは、SubscriberHistory のサブスクリプション記録を更新する前に、イベント記録を使用して通知を生成します。通知を生成するサブスクリプション ルールにこのルールを追加する必要があります。新しいサブスクリプション ルールには配置しないでください。

サブスクリプション ルールの詳細については、「サブスクリプション ルールの定義」を参照してください。

参照

概念

イベント クラスの記録の定義

その他の技術情報

サブスクリプション クラスの定義
UPDATE (Transact-SQL)
SET (Transact-SQL)
IF...ELSE (Transact-SQL)
EXISTS (Transact-SQL)
CREATE TABLE (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手