共用方式為


定義條件動作

更新: 2006 年 7 月 17 日

動作是一組 Transact-SQL 陳述式,每當 Notification Services 引發一項訂閱規則時,就會執行它。每一項訂閱規則都可以包含一個動作,可能是基本動作 (為預先定義的查詢),也可能是條件動作 (讓訂閱者定義一個相當於通知產生查詢的 WHERE 子句)。本主題將描述條件動作,以及如何撰寫基本動作。

ms172509.note(zh-tw,SQL.90).gif重要事項:
只有當您需要讓訂閱者建立自己的複雜條件來產生通知時,才使用條件動作。否則,請使用預先定義的動作,讓使用者輸入參數化查詢的值,這樣比較有效率。如需詳細資訊,請參閱<定義動作>。

條件動作

條件動作接受訂閱者建立的彈性規則。預先定義的動作,只允許訂閱者針對開發人員定義的查詢來指定參數值,而條件動作可以利用布林運算子 (AND、OR 和 NOT) 來組合個別的條件,讓訂閱者針對該查詢,建立相當於 WHERE 子句的條件。

例如,氣象應用程式的事件類別可能包含兩個欄位:[縣/市][預報]。開發人員可以定義一個基本查詢來建立通知,例如:

INSERT INTO dbo.WeatherNotifications(SubscriberId, DeviceName, 
    SubscriberLocale, City, Forecast) 
SELECT [Subscription.SubscriberId], [Subscription.DeviceName], 
    [Subscription.SubscriberLocale], [Input.City], [Input.Forecast])
FROM dbo.FlightEventRule

請注意,此舉是從沿用規則名稱的檢視來選取資料 (此處是 FlightEventRule)。該檢視中的欄位名為 Subscription.SubscriptionFieldNameInput.EventFieldName,欄位名稱必須以方括號括住。

訂閱者可以透過訂閱管理介面,定義相當於 WHERE 子句的條件。例如,使用者可以指定兩個條件:[縣/市] 是 'Seattle',而 [預報] 是 'snow',接著再把這兩個條件以 AND 運算子聯結起來。這就相當於下面的 WHERE 子句:

WHERE City = 'Seattle' AND Forecast LIKE '%snow%'

當 Notification Services 執行訂閱規則時,它會將所有類似的條件一起處理,以提升效能。然後 Notification Services 再於該規則的檢視中,擴展比對輸入和訂閱配對。

效能考量因素

即使 Notification Services 可將所有類似的條件一起處理,但是使用條件動作也很費工。Notification Services 必須取得所有的條件、組織這些條件以便有效評估、進行評估、然後再產生所有訂閱的結果通知。因此,以條件動作來評估規則的時間,通常比評估預定動作更長。

安全性

所有的條件動作,都是在您針對條件動作所指定之資料庫使用者的內容中執行。使用低權限的使用者,可以降低安全威脅,以防萬一有任人危及您的訂閱管理介面,插入意圖存取其他資料表或執行其他動作的條件。

資料庫使用者應該限制權限,只讓使用者從事件來源選取資料,並且只執行條件所用的使用者自訂函數。

當 Notification Services 在應用程式資料庫中建立應用程式物件時,一定要有這個使用者的相關 SQL Server 登入帳戶存在。

交易

條件動作中所有的陳述式,都是同一交易的一部分,因此要不它們就全部順利完成,要不就全部回復。如果交易失敗,Notification Services 會撰寫一個錯誤到 Windows 應用程式記錄檔中。

定義條件動作

如果您是透過 XML 來定義應用程式,請在應用程式定義檔案 (ADF) 中定義條件動作。如果您是以程式設計的方式定義應用程式,請利用 Notification Services Management Objects (NMO) 來定義條件動作。

定義條件動作

SQL Server 登入

由於 Notification Services 會執行指定資料庫使用者內容中所有的條件動作,因此您必須指定與該使用者相關的登入帳戶。這個登入必須在 Notification Services 建立應用程式之前就存在了。如果登入不存在,那麼 Notification Services 一建立應用程式時就會失敗,而且會回復執行個體建立或執行個體更新。

請確定登入具有伺服器的有限權限。登入最好沒有伺服器範圍權限,而且最好不要屬於任何伺服器角色。

定義 SQL Server 登入

資料庫使用者

資料庫使用者是所有條件動作執行所用的帳戶。Notification Services 會將執行條件動作所需的一些權限,授與這個資料庫使用者。如果 Notification Services 在建立應用程式時,並沒有這個資料庫使用者,Notification Services 也會建立這個資料庫使用者。

Notification Services 會授與 Notification Services 物件的必要權限,但是不會授與輸入資料表或檢視的權限,也不會授與條件動作所用之任何使用者自訂函數的權限。在部署應用程式時,您需要授與這些權限。授與這些權限所用的 Transact-SQL 命令,其格式如下:

-- grant permissions on the view for an input event class
GRANT SELECT ON ApplicationSchema.EventClassName TO SqlUserAccount
-- grant permissions on an input event chronicle table
GRANT SELECT ON ChronicleSchema.ChronicleName TO SqlUserAccount
-- grant execute permissions on a user-defined function 
-- used in Subscription.Conditions
GRANT EXEC ON UDFSchema.MyUserDefinedFunction TO SqlUserAccount
定義資料庫使用者

輸入名稱

當您使用條件動作時,必須指定哪一個檢視或資料表含有事件資料。

  • 如果條件動作是在事件規則中,輸入通常就是與事件類別同名的事件檢視。
    注意   請勿使用稱為 NSEventClassNameEvents 的事件資料表做為輸入。這個資料表包含所有尚未從系統移除的事件,並且將會使系統產生重複的通知。
  • 如果條件動作是用於排定的規則,則輸入通常就是事件紀事輯。
    注意   用於排程規則時,請勿使用稱為 EventClassName 的事件檢視做為輸入。這個檢視僅包含目前的事件批次,因此在執行排程規則時經常是空白或不完整的。
定義輸入名稱

輸入結構描述

輸入結構描述是指輸入的資料庫結構描述名稱。

  • 如果輸入是事件檢視,則結構描述就是應用程式結構描述。應用程式結構描述可以在定義應用程式資料庫時定義,也可以是 dbo 的預設值。如需詳細資訊,請參閱<定義應用程式資料庫>。
  • 如果輸入是事件紀事輯,則結構描述是在建立事件紀事輯的 CREATE TABLE 陳述式中定義。這通常與應用程式結構描述一樣。如需詳細資訊,請參閱<定義事件類別的紀事輯>。
定義輸入結構描述

Transact-SQL 運算式

每一個紀事輯動作都會指定產生通知用的核心查詢。該查詢會指定選取訂閱和輸入欄位的查詢,並且將它們加入通知資料表中。

查詢必須從聯結訂閱和事件資料的檢視中,選取訂閱和輸入欄位。檢視中的訂閱欄位,其名稱格式為 [Subscription.SubscriptionFieldName]。輸入(事件) 欄位的名稱格式為 [Input.EventFieldName]。

訂閱者會透過訂閱管理介面,針對查詢建立一個相當於 WHERE 子句的條件。Notification Services 會針對所有相關的訂閱,評估條件動作,然後產生通知。

範本

下面這個 Transact-SQL 範本將示範,如何撰寫條件動作的 Transact-SQL 運算式。

INSERT INTO schema.NotificationClassName(SubscriberId, 
    DeviceName, SubscriberLocale, NotificationFields) 
SELECT [Subscription.SubscriberId], DeviceName, SubscriberLocale, 
    [Input.EventFieldName], ...
FROM schema.RuleName

SELECT 陳述式中,您可以從資料來源 (例如,沿用規則名稱的檢視) 選取 DeviceNameSubscriberLocale 值,或者提供常值,例如 'File' 和 'en-US'。

查詢可以包含其他陳述式,而且不必產生通知。查詢可以執行任何必要的工作,例如維護紀事輯。不過,至少要有一項訂閱規則產生通知。否則,您的應用程式就不會產生通知,以及將通知散發給訂閱者。

INSERT 子句

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

  • 訂閱者識別碼
  • 裝置名稱
  • 訂閱者地區設定

所有的非計算欄位,都是在通知結構描述中定義的。如果您是使用計算欄位,請勿在這些欄位加入值。那些值是在您插入通知資料時計算的。

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

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

使用預存程序

現在您可以呼叫預存程序了,不必將 Transact-SQL 陳述式內嵌在條件動作中。您必須在應用程式資料庫中建立預存程序。您可以在部署指令碼中定義預存程序。您應該在 Notification Services 建立執行個體或加入應用程式之後,以及在您啟用該執行個體或應用程式之前,建立該預存程序。

若要使用預存程序,請將查詢文字換成預存程序的呼叫。下列範例將示範如何呼叫預存程序:

EXECUTE dbo.WeatherConditionActionSP;
定義 Transact-SQL 運算式

撰寫訂閱管理介面

當您在撰寫訂閱管理介面時,您必須考慮應用程式可支援的訂閱類型。以條件式訂閱來說,訂閱管理介面必須允許訂閱者輸入條件,例如從下拉式方塊選取欄位、輸入運算子,以及提供指定值。

如需說明如何加入條件式訂閱的範例程式碼,請參閱<新增訂閱>。

請參閱

參考

Microsoft.SqlServer.NotificationServices.Rules

概念

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

其他資源

INSERT (Transact-SQL)
SELECT (Transact-SQL)
定義訂閱類別
開發訂閱管理介面

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2006 年 7 月 17 日

變更的內容:
  • 新增了有關訂閱管理介面的章節。