更新应用程序

部署 SQL Server Notification Services 实例后,您可以更新该实例承载的应用程序。可通过修改应用程序定义、然后使用 SQL Server Management Studio 或 nscontrol update 命令应用更改来更新应用程序。

若要更新单个应用程序,不需要停止或禁用整个实例。该实例所承载的其他应用程序可以仍然处于运行状态。不过,如果还更改了实例配置中的值,则必须在应用更新前就禁用整个实例。

更新应用程序前请注意以下事项:

  • 如果更改应用程序定义文件 (ADF) 中的订阅类,则 Notification Services 将创建新的订阅表。Notification Services 备份现有订阅数据;您可以使用这些备份还原订阅数据。有关详细信息,请参阅下面的“还原订阅数据”。
  • 更新应用程序通常会删除事件和通知数据。请制定计划重新提交更新前尚未处理的批事件,或本应在应用程序更新期间处理的批事件。
  • 确保应用程序定义中创建 SQL Server 对象的任何代码可以查找并删除(或重命名)任何同名的现有对象。更新进程不会自动删除或重命名用户定义的 SQL Server 对象,因此,通过显式删除或重命名 SQL Server 对象,可避免重复对象错误。
  • 如果您使用的是 Notification Services 标准版,并在实例配置或应用程序定义中指定标准版不支持的选项,则更新进程将停止,实例不会更新。有关详细信息,请参阅Notification Services 版本

更新通知应用程序

更新 Notification Services 实例

还原订阅数据

如果更改 ADF 中的订阅类,Notification Services 将在更新期间重新创建订阅表。此时,Notification Services 通过将“Old”追加到表名重命名现有表,如下所示:

表名 备份名称

NSSubscriptionClassNameSubscriptions

NSSubscriptionClassNameSubscriptionsOld

NSSubscriptionClassNameSchedules (仅限调度的订阅)

NSSubscriptionClassNameSchedulesOld (仅限调度的订阅)

NSSubscriptionClassNameTimeZones(仅限调度的订阅)

NSSubscriptionClassNameTimeZonesOld(仅限调度的订阅)

更新应用程序后,可以通过将数据从备份表复制到新表来还原订阅数据。其中一种方法是使用 Transact-SQL 查询,从备份表选择数据,再将数据插入新表。

如果需要在还原数据时进行转换,例如,将条件值添加到新列,请考虑使用 SQL Server 2005 Integration Services (SSIS) (SSIS) 在表间移动数据。

验证还原的订阅数据后,应该删除或重命名备份表。如果保留表,以后再次更新订阅类,则更新将因为备份表已存在而失败。

示例

还原事件触发的订阅

Flight Sample 应用程序具有使用事件触发的规则来生成通知的订阅类。对于此订阅类,所有订阅数据存储在名为 NSFlightSubscriptionsSubscriptions 的表中。如果更改此订阅类,然后更新 Flight 应用程序,则 Notification Services 将在名为 NSFlightSubscriptionsSubscriptionsOld 的表中创建订阅数据的备份。

编写查询将数据从备份复制到新表时,需要知道列名。可以通过运行以下两个查询获得此数据:

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。只要订阅类一经修改,应用程序就会被更新,此时您就可以使用以下查询还原这些表中的数据。

首先,还原时区数据:

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 帮助