定义操作
操作是 Notification Services 每次触发一个订阅规则时运行的一组 Transact-SQL 语句。每个订阅规则都可能包含一个操作,该操作可以是基本操作(是预定义的查询),也可以是条件操作(允许订阅方为通知生成查询定义 WHERE 子句的等价子句)。本主题说明基本操作以及如何编写基本操作。
操作
操作中的 Transact-SQL 语句针对规则执行某种工作。此工作通常是指根据订阅字段和事件字段之间的联接生成通知。以下示例显示一个为天气预报应用程序生成通知的操作:
INSERT INTO WeatherNotifications (SubscriberId, DeviceName,
SubscriberLocale, City, Forecast)
SELECT s.SubscriberId, s.DeviceName,
s.SubscriberLocale, e.City, e.Forecast
FROM WeatherEvents e
JOIN WeatherSubscriptions s
ON s.City = e.City;
该示例通过 WeatherEvents 事件视图和 WeatherSubscriptions 订阅表之间的联接选择订阅方、设备、区域设置、城市以及天气预报文本,然后将结果添加到 WeatherNotifications 通知表。Notification Services 自动创建 WeatherEvents 事件类的 WeatherEvents 视图;该视图仅包含生成器要处理的当前事件集。
操作不需要使用事件视图和订阅表。例如,您可以查询其他数据库中的表。
此外,不需要操作来生成通知。但是,至少一个订阅规则应当具有一个生成通知的操作。否则,您的应用程序将无法生成通知并将通知发送给订阅方。
有关编写 Transact-SQL 查询的详细信息,请参阅查询基础知识。
INSERT 语句
注意: |
---|
在 Notification Services 2.0 中,INSERT 语句替换用于创建通知的通知函数。 |
如代码示例中所示,您必须按照以下顺序在 INSERT 语句中指定下列字段:
- SubscriberId
- DeviceName
- SubscriberLocale
- 通知架构中定义的所有非计算字段。如果您使用计算字段,则不要将值插入这些字段;这些字段的值会在您插入通知数据时进行计算。
只添加到订阅规则之内的通知表中。当处理订阅规则时,Notification Services 将准备每个规则触发,接着触发规则,然后在规则触发之后执行清理操作。如果尝试将通知插入订阅规则触发之外的通知表中,则不执行准备和清理操作,这样会导致失败。
将 WHERE 子句用于其他条件
如果您的订阅架构具有多个自定义字段,则可以添加 WHERE 子句以提供其他条件。例如,如果天气预报应用程序允许订阅方输入一个温度范围,则您可以将以下子句添加到上一个代码示例中:
WHERE e.HighTemp > s.High
OR e.LowTemp < s.Low
由于具有该 WHERE 子句,因此,仅当事件中的 HighTemp 值高于订阅方输入的范围或事件中的 LowTemp 值低于订阅方输入的范围时,操作才生成通知。
注意: |
---|
如果您在 XML 文件中定义应用程序,则必须使用实体引用替换保留的 XML 字符(如“<”)。有关详细信息,请参阅 XML Reserved Characters。 |
其他子句
Transact-SQL 支持 SELECT 语句的许多其他子句。但是,大多数子句与 Notification Services 无关。例如,ORDER BY 子句对 SELECT 查询的结果进行排序,但是该顺序不影响 Notification Services 如何或何时格式化通知并传递通知。可以使用 UNION 子句组合两个查询的结果,但是很少将该子句用于订阅规则。
使用存储过程
操作可以调用存储过程,而不是将 Transact-SQL 语句嵌入操作中。您必须在应用程序数据库中创建存储过程。您可以在部署脚本中定义存储过程。应当在 Notification Services 创建实例或添加应用程序之后但在您启用实例或应用程序之前创建存储过程。
若要使用存储过程,请从操作中执行存储过程。以下示例显示一个执行存储过程的操作:
EXECUTE dbo.WeatherActionSP;
事务
操作中的所有语句都是同一个事务的一部分,因此它们要么全部成功完成,要么全部被回滚。如果事务失败,则 Notification Services 会将错误写入 Windows 应用程序日志中。
事件规则的操作
事件规则操作通常从以事件类命名的视图中选择事件数据。该事件视图只提供当前事件集,这样可确保操作不会使用事件表中的旧事件。
注意: |
---|
决不能使用名称为 NSEventClassNameEvents 的事件表作为事件源。事件表包含所有尚未从应用程序中删除的事件,可使应用程序生成重复的通知。此外,决不能将通知直接插入通知表中。相反,应将通知插入以通知类命名的视图中。 |
模板
以下模板显示事件规则操作的基本结构。该操作模板显示如何将事件视图中的事件与订阅视图中的订阅进行联接,以及如何将结果插入通知视图中。
INSERT INTO schema.notificationClassName (SubscriberId, DeviceName,
SubscriberLocale, NotificationFields)
SELECT s.SubscriberId, DeviceName, SubscriberLocale, Fields
FROM schema.subscriptionClassName s
JOIN schema.eventClassName e
ON s.columnName = e.columnName
[WHERE...][;]
您既可以从数据源(如订阅视图)中选择 DeviceName 值和 SubscriberLocale 值,也可以提供文字值(如“File”和“en-US”)。
请注意,SubscriberId 值和 DeviceName 值必须与 SubscriberDevices 表中的记录相匹配。
事件历史记录维护
您还可以使用事件规则维护事件历史记录。这样允许事件规则在生成通知之前使用旧的事件历史记录检查先前的事件值。您既可以为历史记录维护创建新的事件规则,也可以将历史记录维护代码添加到现有事件规则的语句中。
注意: |
---|
如果具有多个事件规则,则 Notification Services 可按照任意顺序触发这些规则。 |
以下规则首先从事件历史记录中删除所有数据。然后,规则从 WeatherEvents 视图中选择当前的事件批次,并将这些事件添加到事件历史记录中。
DELETE FROM dbo.WeatherEventsChron;
INSERT INTO dbo.WeatherEventsChron(City, Date, Low, High, Forecast)
SELECT e.City, e.Date, e.Low, e.High, e.Forecast
FROM dbo.WeatherEvents e;
如果要在生成通知之前更新事件历史记录,则请在事件类中定义事件历史记录规则。有关详细信息,请参阅定义事件历史记录规则。
定义事件规则的操作
如果您通过 XML 定义应用程序,则请在该应用程序定义文件 (ADF) 中定义操作。如果您通过编程方式定义应用程序,则请使用 Notification Services 管理对象 (NMO) 定义操作。
- Action Element for EventRule (ADF)
- Action 属性 (NMO)
预定规则的操作
预定规则操作通常从事件历史记录(而不是事件视图)中选择事件数据。事件视图只提供当前的事件批次,当运行预定规则时,该视图可能为空。
模板
以下模板显示预定规则操作的基本结构。该操作模板显示如何将事件历史记录中的事件与订阅视图中的订阅进行联接,以及如何将结果添加到通知视图中。
INSERT INTO schema.notificationClassName (SubscriberId, DeviceName,
SubscriberLocale, NotificationFields)
SELECT s.SubscriberId, DeviceName, SubscriberLocale, Fields
FROM schema.subscriptionClassName s
JOIN schema.eventChronicleName ec
ON s.columnName = ec.columnName
[WHERE...][;]
在 SELECT 语句中,您既可以从数据源(如订阅视图)中选择 DeviceName 值和 SubscriberLocale 值,也可以提供文字值(如“File”和“en-US”)。
订阅历史记录维护
您还可以使用预定规则维护订阅历史记录。有关订阅历史记录的详细信息,请参阅为订阅类定义历史记录。您既可以为历史记录维护创建新的预定规则,也可以将历史记录维护代码添加到现有预定规则的语句中。
注意: |
---|
如果具有多个预定规则,则 Notification Services 可按照任意顺序触发这些规则。 |
定义预定规则的操作
如果您通过 XML 定义应用程序,则请在该应用程序定义文件 (ADF) 中定义操作。如果您通过编程方式定义应用程序,则请使用 NMO 定义操作。
请参阅
概念
其他资源
WHERE (Transact-SQL)
INSERT (Transact-SQL)
SELECT (Transact-SQL)
定义订阅类