定義條件動作
更新: 2006 年 7 月 17 日
動作是一組 Transact-SQL 陳述式,每當 Notification Services 引發一項訂閱規則時,就會執行它。每一項訂閱規則都可以包含一個動作,可能是基本動作 (為預先定義的查詢),也可能是條件動作 (讓訂閱者定義一個相當於通知產生查詢的 WHERE 子句)。本主題將描述條件動作,以及如何撰寫基本動作。
重要事項: |
---|
只有當您需要讓訂閱者建立自己的複雜條件來產生通知時,才使用條件動作。否則,請使用預先定義的動作,讓使用者輸入參數化查詢的值,這樣比較有效率。如需詳細資訊,請參閱<定義動作>。 |
條件動作
條件動作接受訂閱者建立的彈性規則。預先定義的動作,只允許訂閱者針對開發人員定義的查詢來指定參數值,而條件動作可以利用布林運算子 (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.SubscriptionFieldName 和 Input.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) 來定義條件動作。
定義條件動作
- ConditionAction Element (ADF)
- Microsoft.SqlServer.Management.Nmo.SubscriptionClass.SubscriptionConditionEventRules 屬性 (NMO)
- Microsoft.SqlServer.Management.Nmo.SubscriptionClass.SubscriptionConditionScheduledRules 屬性 (NMO)
SQL Server 登入
由於 Notification Services 會執行指定資料庫使用者內容中所有的條件動作,因此您必須指定與該使用者相關的登入帳戶。這個登入必須在 Notification Services 建立應用程式之前就存在了。如果登入不存在,那麼 Notification Services 一建立應用程式時就會失敗,而且會回復執行個體建立或執行個體更新。
請確定登入具有伺服器的有限權限。登入最好沒有伺服器範圍權限,而且最好不要屬於任何伺服器角色。
定義 SQL Server 登入
- SqlLogin Element (ADF)
- Microsoft.SqlServer.Management.Nmo.SubscriptionConditionEventRule.SqlLoginName 屬性 (NMO)
- Microsoft.SqlServer.Management.Nmo.SubscriptionConditionScheduledRule.SqlLoginName 屬性 (NMO)
資料庫使用者
資料庫使用者是所有條件動作執行所用的帳戶。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
定義資料庫使用者
- SqlUser Element (ADF)
- Microsoft.SqlServer.Management.Nmo.SubscriptionConditionEventRule.SqlUserName 屬性 (NMO)
- Microsoft.SqlServer.Management.Nmo.SubscriptionConditionScheduledRule.SqlUserName 屬性 (NMO)
輸入名稱
當您使用條件動作時,必須指定哪一個檢視或資料表含有事件資料。
- 如果條件動作是在事件規則中,輸入通常就是與事件類別同名的事件檢視。
注意 請勿使用稱為 NSEventClassNameEvents 的事件資料表做為輸入。這個資料表包含所有尚未從系統移除的事件,並且將會使系統產生重複的通知。 - 如果條件動作是用於排定的規則,則輸入通常就是事件紀事輯。
注意 用於排程規則時,請勿使用稱為 EventClassName 的事件檢視做為輸入。這個檢視僅包含目前的事件批次,因此在執行排程規則時經常是空白或不完整的。
定義輸入名稱
- InputName Element (ADF)
- Microsoft.SqlServer.Management.Nmo.SubscriptionConditionEventRule.InputTypeName 屬性 (NMO)
- Microsoft.SqlServer.Management.Nmo.SubscriptionConditionScheduledRule.InputTypeName 屬性 (NMO)
輸入結構描述
輸入結構描述是指輸入的資料庫結構描述名稱。
- 如果輸入是事件檢視,則結構描述就是應用程式結構描述。應用程式結構描述可以在定義應用程式資料庫時定義,也可以是 dbo 的預設值。如需詳細資訊,請參閱<定義應用程式資料庫>。
- 如果輸入是事件紀事輯,則結構描述是在建立事件紀事輯的 CREATE TABLE 陳述式中定義。這通常與應用程式結構描述一樣。如需詳細資訊,請參閱<定義事件類別的紀事輯>。
定義輸入結構描述
- InputSchema Element (ADF)
- Microsoft.SqlServer.Management.Nmo.SubscriptionConditionEventRule.InputTypeSchema 屬性 (NMO)
- Microsoft.SqlServer.Management.Nmo.SubscriptionConditionScheduledRule.InputTypeSchema 屬性 (NMO)
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 陳述式中,您可以從資料來源 (例如,沿用規則名稱的檢視) 選取 DeviceName 和 SubscriberLocale 值,或者提供常值,例如 'File' 和 'en-US'。
查詢可以包含其他陳述式,而且不必產生通知。查詢可以執行任何必要的工作,例如維護紀事輯。不過,至少要有一項訂閱規則產生通知。否則,您的應用程式就不會產生通知,以及將通知散發給訂閱者。
INSERT 子句
根據範本所示範,您必須在 INSERT 陳述式,以下列順序指定下列欄位:
- 訂閱者識別碼
- 裝置名稱
- 訂閱者地區設定
所有的非計算欄位,都是在通知結構描述中定義的。如果您是使用計算欄位,請勿在這些欄位加入值。那些值是在您插入通知資料時計算的。
請注意,SubscriberId 和 DeviceName 值都必須與 SubscriberDevices 資料表中的記錄相符。
請只加入一項訂閱規則的通知資料表中。在處理訂閱規則時,Notification Services 會準備引發每一項規則,接著引發這些規則,然後再清除規則。如果您要把通知插入訂閱規則引發之外,就不會執行準備和清除,因而導致失敗。
使用預存程序
現在您可以呼叫預存程序了,不必將 Transact-SQL 陳述式內嵌在條件動作中。您必須在應用程式資料庫中建立預存程序。您可以在部署指令碼中定義預存程序。您應該在 Notification Services 建立執行個體或加入應用程式之後,以及在您啟用該執行個體或應用程式之前,建立該預存程序。
若要使用預存程序,請將查詢文字換成預存程序的呼叫。下列範例將示範如何呼叫預存程序:
EXECUTE dbo.WeatherConditionActionSP;
定義 Transact-SQL 運算式
- SqlExpression Element for ConditionAction (ADF)
- Microsoft.SqlServer.Management.Nmo.SubscriptionConditionEventRule.SqlExpression 屬性 (NMO)
- Microsoft.SqlServer.Management.Nmo.SubscriptionConditionScheduledRule.SqlExpression 屬性 (NMO)
撰寫訂閱管理介面
當您在撰寫訂閱管理介面時,您必須考慮應用程式可支援的訂閱類型。以條件式訂閱來說,訂閱管理介面必須允許訂閱者輸入條件,例如從下拉式方塊選取欄位、輸入運算子,以及提供指定值。
如需說明如何加入條件式訂閱的範例程式碼,請參閱<新增訂閱>。
請參閱
參考
Microsoft.SqlServer.NotificationServices.Rules
概念
其他資源
INSERT (Transact-SQL)
SELECT (Transact-SQL)
定義訂閱類別
開發訂閱管理介面
說明及資訊
變更歷程記錄
版本 | 歷程記錄 |
---|---|
2006 年 7 月 17 日 |
|