アプリケーションの更新

SQL Server Notification Services のインスタンスを配置した後に、インスタンスによってホストされたアプリケーションを更新できます。アプリケーション定義を変更し、次に SQL Server Management Studio または nscontrol update コマンドを使用して変更を適用することにより、アプリケーションを更新します。

1 つのアプリケーションを更新するために、インスタンス全体を停止または無効にする必要はありません。インスタンスによってホストされている他のアプリケーションは、実行したままにしておくことができます。ただし、インスタンス構成の値も変更する場合は、インスタンス全体を無効にしてから、更新を適用する必要があります。

アプリケーションを更新する前に、次の点を考慮してください。

  • アプリケーション定義ファイル (ADF) でサブスクリプション クラスを変更した場合、Notification Services は新しいサブスクリプション テーブルを作成します。Notification Services は既存のサブスクリプション データのバックアップを作成するので、これらのバックアップを使って、サブスクリプション データを復元できます。詳細については、以下の「サブスクリプション データの復元」を参照してください。
  • アプリケーションを更新すると、通常、イベント データと通知データが削除されます。更新前に処理されなかったイベントのバッチ、またはアプリケーションの更新中に処理されたイベントのバッチを再送信することを計画します。
  • アプリケーション定義内の SQL Server オブジェクトを作成するコードが、同じ名前の既存のオブジェクトをチェックして、削除または名前を変更するようにしてください。更新プロセスは、ユーザー定義の SQL Server オブジェクトを自動的に削除したり名前を変更したりしないため、SQL Server オブジェクトを明示的に削除したり名前を変更することにより、重複オブジェクト エラーを回避できます。
  • Notification Services Standard Edition を使用していて、インスタンス構成またはアプリケーション定義で Standard Edition でサポートされていないオプションを指定した場合、更新プロセスはインスタンスを更新せずに停止します。詳細については、「Notification Services のエディション」を参照してください。

通知アプリケーションを更新するには

Notification Services のインスタンスを更新するには

サブスクリプション データの復元

ADF でサブスクリプション クラスを変更する場合、Notification Services は更新中にサブスクリプション テーブルを再作成します。この場合、Notification Services は、次のようにテーブル名に "Old" を追加して既存のテーブルの名前を変更します。

テーブル名 バックアップ名

NSSubscriptionClassNameSubscriptions

NSSubscriptionClassNameSubscriptionsOld

NSSubscriptionClassNameSchedules (定期的なサブスクリプションのみ)

NSSubscriptionClassNameSchedulesOld (定期的なサブスクリプションのみ)

NSSubscriptionClassNameTimeZones (定期的なサブスクリプションのみ)

NSSubscriptionClassNameTimeZonesOld (定期的なサブスクリプションのみ)

アプリケーションを更新した後、バックアップ テーブルから新しいテーブルにデータをコピーすることによりサブスクリプション データを復元できます。これを行う 1 つの方法は、Transact-SQL クエリを使用して、バックアップ テーブルからデータを選択し、それを新しいテーブルに挿入することです。

新しい列への条件値の追加など、復元中にデータを変換する必要がある場合は、SQL Server 2005 Integration Services (SSIS) (SSIS) を使用して、テーブル間でデータを移動するようにしてください。

復元されたサブスクリプション データを確認した後、バックアップ テーブルを削除するか、名前を変更する必要があります。テーブルをそのままにしておいて、後で再度サブスクリプション クラスを更新すると、バックアップ テーブルが既に存在するため、更新は失敗します。

イベント トリガ サブスクリプションの復元

Flight サンプル アプリケーションには、イベント トリガ ルールを使用して通知を生成するサブスクリプション クラスがあります。このサブスクリプション クラスでは、すべてのサブスクリプション データは、NSFlightSubscriptionsSubscriptions という名前のテーブルに格納されます。サブスクリプション クラスを変更してから Flight アプリケーションを更新した場合、Notification Services はサブスクリプション データのバックアップを NSFlightSubscriptionsSubscriptionsOld という名前のテーブルに作成します。

バックアップから新しいテーブルにデータをコピーするクエリを記述する場合、列名がわかっている必要があります。次の 2 つのクエリを実行することにより、このデータを取得できます。

USE [FlightInstanceFlight];
SELECT * FROM [NSFlightSubscriptionsSubscriptions];
SELECT * FROM [NSFlightSubscriptionsSubscriptionsOld];

列名が判明したら、NSFlightSubscriptionsSubscriptionsOld から NSFlightSubscriptionsSubscriptions へデータをコピーするクエリを記述できます。

この例で使用されている更新では、サブスクリプション クラス (およびルール) の Carrier 列の名前が Airline に変更されました。この変更は、次のクエリで反映されます。

USE [FlightInstanceFlight];
SET IDENTITY_INSERT [dbo].[NSFlightSubscriptionsSubscriptions] ON;
INSERT INTO [dbo].[NSFlightSubscriptionsSubscriptions]
( [SubscriptionId], [SubscriberId], [Created], [Updated], [Enabled], 
    [DeviceName], [SubscriberLocale], [LeavingFrom], [GoingTo], 
    [Airline], [Price] )
SELECT [SubscriptionId], [SubscriberId], [Created], [Updated], 
       [Enabled], [DeviceName], [SubscriberLocale], [LeavingFrom], 
       [GoingTo], [Carrier], [Price]
FROM [dbo].[NSFlightSubscriptionsSubscriptionsOld];
SET IDENTITY_INSERT [dbo].[NSFlightSubscriptionsSubscriptions] OFF;

このクエリが正常に完了したら、NSFlightSubscriptionsSubscriptionsOld を削除するか、名前を変更できます。

定期的なサブスクリプションの復元

Weather アプリケーションは、定期的なサブスクリプションを使用します。定期的なサブスクリプションのデータは、NSWeatherSubscriptionsSubscriptionNSWeatherSubscriptionsSchedulesNSWeatherSubscriptionsTimeZones の 3 つのテーブルに格納されます。サブスクリプション クラスが変更されて、アプリケーションが更新されると常に、次のクエリを使用してこれらのテーブルのデータを復元できます。

最初に、タイム ゾーンのデータを復元します。

USE [WeatherInstanceWeather];
INSERT INTO [dbo].[NSWeatherSubscriptionsTimeZones]
    ( [TimeZoneId], [UtcOffset] )
SELECT [TimeZoneId], [UtcOffset]
FROM [dbo].[NSWeatherSubscriptionsTimeZonesOld];

次に、スケジュール データを復元します。

SET IDENTITY_INSERT [dbo].[NSWeatherSubscriptionsSchedules] ON
INSERT INTO [dbo].[NSWeatherSubscriptionsSchedules]
    ( [ScheduleId], [UtcTime], [TimeZoneId], [ScheduleType], 
      [ScheduleData], [ScheduleText] )
SELECT [ScheduleId], [UtcTime], [TimeZoneId], [ScheduleType], 
       [ScheduleData], [ScheduleText]
FROM [dbo].[NSWeatherSubscriptionsSchedulesOld]
ORDER BY [ScheduleId];
SET IDENTITY_INSERT [dbo].[NSWeatherSubscriptionsSchedules] OFF;

最後に、サブスクリプション データを復元します。

SET IDENTITY_INSERT [dbo].[NSWeatherSubscriptionsSubscriptions] ON;
INSERT INTO [dbo].[NSWeatherSubscriptionsSubscriptions]
    ( [SubscriptionId], [SubscriberId], [Created], [Updated], 
      [Enabled], [ScheduleId], [DeviceName], [SubscriberLocale], 
      [City] )
SELECT [SubscriptionId], [SubscriberId], [Created], [Updated], 
       [Enabled], [ScheduleId], [DeviceName], [SubscriberLocale], 
       [City]
FROM [dbo].[NSWeatherSubscriptionsSubscriptionsOld];
SET IDENTITY_INSERT [dbo].[NSWeatherSubscriptionsSubscriptions] OFF;

データが新しいテーブルに転送されたことを確認した後、古いテーブルを削除するか、名前を変更できます。

参照

概念

インスタンスへのアプリケーションの追加
インスタンスからのアプリケーションの削除

その他の技術情報

インスタンスとアプリケーションの更新
SQL Server Integration Services

ヘルプおよび情報

SQL Server 2005 の参考資料の入手