共用方式為


定義動作

動作是一組 Transact-SQL 陳述式,每當 Notification Services 引發一項訂閱規則時,就會執行它。每一項訂閱規則都可以包含一個動作,可能是基本動作 (為預先定義的查詢),也可能是條件動作 (讓訂閱者定義一個相當於通知產生查詢的 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 陳述式

ms171316.note(zh-tw,SQL.90).gif附註:
INSERT 陳述式會取代在 Notification Services 2.0 建立通知所用的通知函數。

根據程式碼範例所示範,您必須在 INSERT 陳述式,以下列順序指定下列欄位:

  • SubscriberId
  • DeviceName
  • SubscriberLocale
  • 所有在通知結構描述中定義的非計算欄位。如果您使用計算欄位,請勿將值插入這些欄位中;那些欄位的值,會在您插入通知資料時計算。

請只加入一項訂閱規則的通知資料表中。在處理訂閱規則時,Notification Services 會準備引發每一項規則,接著引發這些規則,然後再清除規則。如果您要把通知插入訂閱規則引發之外,就不會執行準備和清除,因而導致失敗。

針對其他條件使用 WHERE 子句

如果您的訂閱結構描述有超過一個自訂欄位,可以加入一個 WHERE 子句,另外提供其他條件。例如,如果氣象應用程式允許訂閱者輸入一個溫度範圍,則可以將下列子句加入前一個程式碼範例中:

WHERE  e.HighTemp > s.High 
    OR e.LowTemp < s.Low

由於這個 WHERE 子句的緣故,如果事件中的 HighTemp 值大於訂閱者所輸入的範圍,或者事件中的 LowTemp 值小於訂閱者所輸入的範圍,那麼動作只會產生通知。

ms171316.note(zh-tw,SQL.90).gif附註:
如果您在 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 應用程式記錄檔中。

事件規則的動作

事件規則動作通常會從沿用事件類別名稱的檢視中,選取該事件資料。這個事件檢視只會提供目前的事件收集,以確保動作不使用事件資料表中的舊事件。

ms171316.Caution(zh-tw,SQL.90).gif注意:
千萬不要使用事件資料表,其名稱為 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...][;]

您可以從資料來源 (例如,訂閱檢視) 選取 DeviceNameSubscriberLocale 值,或者提供常值,例如 'File' 和 'en-US'。

請注意,SubscriberIdDeviceName 值都必須與 SubscriberDevices 資料表中的記錄相符。

事件紀事輯維護

您也可以利用事件規則來維護事件紀事輯。此舉可以在產生通知之前,讓事件規則使用舊事件紀事輯來檢查之前的事件值。您可以針對紀事輯維護而建立新的事件規則,也可以將紀事輯維護程式碼加入現有事件規則的陳述式中。

ms171316.note(zh-tw,SQL.90).gif附註:
如果您有多個事件規則,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 Management Objects (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 陳述式中,您可以從資料來源 (例如,訂閱檢視) 選取 DeviceNameSubscriberLocale 值,或者提供常值,例如 'File' 和 'en-US'。

訂閱紀事輯維護

您也可以利用排定的規則來維護訂閱紀事輯。如需有關訂閱紀事輯的詳細資訊,請參閱<定義訂閱類別的紀事輯>。您可以針對紀事輯維護而建立新的排定規則,也可以將紀事輯維護程式碼加入現有排定規則的陳述式中。

ms171316.note(zh-tw,SQL.90).gif附註:
如果您有多個排定的規則,Notification Services 可以採任何順序引發這些規則。

若要定義排定規則的動作

如果您是利用 XML 來定義應用程式,請在應用程式定義檔案 (ADF) 中定義動作。如果您是以程式設計的方式定義應用程式,請利用 NMO 來定義動作。

請參閱

概念

定義條件動作
定義事件規則
定義排程規則

其他資源

WHERE (Transact-SQL)
INSERT (Transact-SQL)
SELECT (Transact-SQL)
定義訂閱類別

說明及資訊

取得 SQL Server 2005 協助