更新应用程序
部署 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 应用程序使用调度订阅。调度订阅数据存储在三个表中:NSWeatherSubscriptionsSubscription、NSWeatherSubscriptionsSchedules 和 NSWeatherSubscriptionsTimeZones。只要订阅类一经修改,应用程序就会被更新,此时您就可以使用以下查询还原这些表中的数据。
首先,还原时区数据:
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