Definieren von Bedingungsaktionen

Aktualisiert: 17. Juli 2006

Eine Aktion ist eine Gruppe von Transact-SQL-Anweisungen, die von Notification Services bei jedem Auslösen einer Abonnementregel ausgeführt werden. Jede Abonnementregel kann eine Aktion enthalten, entweder eine grundlegende Aktion, die eine vordefinierte Abfrage ist, oder eine Bedingungsaktion, die es Abonnenten ermöglicht, die Entsprechung einer WHERE-Klausel für die Benachrichtigungsgenerierungsabfrage zu definieren. In diesem Thema werden Bedingungsaktionen und die Vorgehensweise zum Schreiben von Bedingungsaktionen beschrieben.

ms172509.note(de-de,SQL.90).gifWichtig:
Verwenden Sie Bedingungsaktionen nur dann, wenn Sie es Abonnenten ermöglichen müssen, ihre eigenen komplexen Bedingungen für das Generieren von Benachrichtigungen zu erstellen. Verwenden Sie andernfalls vordefinierte Aktionen, die es Benutzern ermöglichen, Werte für eine parametrisierte Abfrage einzugeben. Dies ist effizienter. Weitere Informationen finden Sie unter Definieren von Aktionen.

Bedingungsaktionen

Eine Bedingungsaktion ermöglicht flexible Regeln, die von Abonnenten erstellt werden. Während eine vordefinierte Aktion es Abonnenten nur ermöglicht, Parameterwerte für entwicklerdefinierte Abfragen anzugeben, ermöglicht es eine Bedingungsaktion einem Abonnenten, die Entsprechung einer WHERE-Klausel für die Abfrage zu erstellen und dabei mit booleschen Operatoren (AND, OR und NOT) einzelne Bedingungen zu kombinieren.

Beispielsweise kann eine Wetteranwendung eine Ereignisklasse aufweisen, die zwei Felder enthält: City und Forecast. Der Entwickler kann eine grundlegende Abfrage zum Erstellen von Benachrichtigungen definieren, wie z. B. die folgende:

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

Beachten Sie, dass hierdurch Daten aus einer Sicht ausgewählt werden, die nach der Regel (in diesem Fall FlightEventRule) benannt ist. Die Felder in dieser Sicht sind mit Subscription.SubscriptionFieldName und Input.EventFieldName benannt. Hierdurch ist es erforderlich, die Feldnamen in eckige Klammern einzuschließen.

Ein Abonnent kann über eine Abonnementverwaltungsschnittstelle Bedingungen definieren, die einer WHERE-Klausel entsprechen. Beispielsweise kann ein Benutzer zwei Bedingungen angeben - City ist 'Seattle' und Forecast enthält 'snow' - und dann diese Bedingungen mit einem AND-Operator verknüpfen. Das entspricht der folgenden WHERE-Klausel:

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

Beim Ausführen der Abonnementregel verarbeitet Notification Services alle ähnlichen Bedingungen zusammen. Dies verbessert die Leistung. Anschließend füllt Notification Services die Sicht der Regel mit übereinstimmenden Eingabe-/Abonnementpaaren auf.

Überlegungen zur Leistung

Obwohl Notification Services alle ähnlichen Bedingungen zusammen verarbeitet, entsteht beim Verwenden von Bedingungsaktionen ein Verwaltungsaufwand. Notification Services muss eine Menge aller Bedingungen abrufen, die Bedingungen für eine effiziente Auswertung organisieren, sie auswerten und dann die resultierenden Benachrichtigungen für alle Abonnements erstellen. Aufgrund dieses Aufwands dauert es im Allgemeinen länger, Regeln mit Bedingungsaktionen auszuwerten als vordefinierte Aktionen auszuwerten.

Sicherheit

Alle Bedingungsaktionen werden im Kontext eines Datenbankbenutzers ausgeführt, den Sie für die Bedingungsaktion angeben. Falls jemand die Sicherheit der Abonnementverwaltungsschnittstelle gefährdet und Bedingungen einfügt, die versuchen, auf andere Tabellen zuzugreifen oder andere Aktionen auszuführen, minimiert das Verwenden eines Benutzers mit geringen Privilegien das Sicherheitsrisiko.

Der Datenbankbenutzer sollte über eingeschränkte Berechtigungen verfügen, die es dem Benutzer ermöglichen, nur Daten aus Ereignisquellen auszuwählen und nur benutzerdefinierte Funktionen auszuführen, die von Bedingungen verwendet werden.

Wenn Notification Services Anwendungsobjekte in der Anwendungsdatenbank erstellt, muss das diesem Benutzer zugeordnete SQL Server-Anmeldekonto vorhanden sein.

Transaktionen

Alle Anweisungen in einer Bedingungsaktion sind Teil der gleichen Transaktion. Daher werden sie entweder alle erfolgreich abgeschlossen, oder es wird für alle ein Rollback ausgeführt. Wenn die Transaktion einen Fehler erzeugt, schreibt Notification Services einen Fehler in das Windows-Anwendungsprotokoll.

Definieren einer Bedingungsaktion

Wenn Sie eine Anwendung über XML definieren, definieren Sie Bedingungsaktionen in der Anwendungsdefinitionsdatei (ADF, Application Definition File). Wenn Sie eine Anwendung programmgesteuert definieren, verwenden Sie Notification Services Management Objects (NMO) zum Definieren von Bedingungsaktionen.

So definieren Sie eine Bedingungsaktion

SQL Server-Anmeldename

Sie müssen das dem Benutzer zugeordnete Anmeldekonto angeben, da Notification Services alle Bedingungsaktionen im Kontext eines angegebenen Datenbankbenutzers ausführt. Der Anmeldename muss vorhanden sein, bevor Notification Services die Anwendung erstellt. Ist der Anmeldename nicht vorhanden, erzeugt Notification Services bei dem Versuch, die Anwendung zu erstellen, einen Fehler und führt ein Rollback der Instanzerstellung oder Instanzaktualisierung aus.

Stellen Sie sicher, dass der Anmeldename über eingeschränkte Berechtigungen auf dem Server verfügt. Es ist ratsam, dass der Anmeldename über keine serverweiten Berechtigungen verfügt und keinen Serverrollen angehört.

So definieren Sie den SQL Server-Anmeldenamen

Datenbankbenutzer

Der Datenbankbenutzer ist das Konto, unter dem alle Bedingungsaktionen ausgeführt werden. Notification Services erteilt diesem Datenbankbenutzer einige der Berechtigungen, die für das Ausführen von Bedingungsaktionen erforderlich sind. Ist der Datenbankbenutzer nicht vorhanden, wenn Notification Services die Anwendung erstellt, erstellt Notification Services auch den Datenbankbenutzer.

Notification Services erteilt die erforderlichen Berechtigungen für Notification Services-Objekte, erteilt jedoch keine Berechtigungen für die Eingabetabellen oder Eingabesichten, noch erteilt es Berechtigungen für benutzerdefinierte Funktionen, die von Bedingungsaktionen verwendet werden. Sie müssen diese Berechtigungen beim Bereitstellen der Anwendung erteilen. Befehle von Transact-SQL für das Erteilen dieser Berechtigungen nehmen die folgende Form an:

-- 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
So definieren Sie den Datenbankbenutzer

Eingabename

Wenn Sie eine Bedingungsaktion verwenden, müssen Sie angeben, welche Sicht oder Tabelle die Ereignisdaten enthält.

  • Wenn sich die Bedingungsaktion in einer Ereignisregel befindet, handelt es sich bei der Eingabe in der Regel um die Ereignissicht, die den gleichen Namen wie die Ereignisklasse besitzt.
    Vorsicht   Verwenden Sie nicht die Ereignistabelle mit der Bezeichnung NSEventClassNameEvents als Eingabe. Diese Tabelle enthält alle Ereignisse, die nicht aus dem System entfernt wurden und doppelte Benachrichtigungen verursachen.
  • Wenn die Bedingungsaktion für eine geplante Regel vorgesehen ist, handelt es sich bei der Eingabe in der Regel um einen Ereignisverlauf.
    Vorsicht   Verwenden Sie bei geplanten Regeln nicht die Ereignissicht mit der Bezeichnung EventClassName als Eingabe. Diese Sicht enthält nur den aktuellen Ereignisbatch und ist häufig leer oder für geplante Regeln nicht vollständig.
So definieren Sie den Eingabenamen

Eingabeschema

Bei dem Eingabeschema handelt es sich um den Datenbank-Schemanamen für die Eingabe.

  • Das Schema ist das Anwendungsschema, wenn die Eingabe die Ereignissicht ist. Das Anwendungsschema kann beim Definieren der Anwendungsdatenbank definiert werden oder den Standardwert dbo aufweisen. Weitere Informationen finden Sie unter Definieren der Anwendungsdatenbank.
  • Wenn die Eingabe ein Ereignisverlauf ist, wird das Schema in der CREATE TABLE-Anweisung definiert, die den Ereignisverlauf erstellt. Dieses Schema stimmt normalerweise mit dem Anwendungsschema überein. Weitere Informationen finden Sie unter Definieren von Verläufen für eine Ereignisklasse.
So definieren Sie das Eingabeschema

Transact-SQL-Ausdruck

Jede Verlaufsaktion gibt die Kernabfrage für das Generieren von Benachrichtigungen an. Die Abfrage gibt die Abfrage an, die Abonnement- und Eingabefelder auswählt und der Benachrichtigungstabelle hinzufügt.

Die Abfrage muss Abonnement- und Eingabefelder aus einer Sicht auswählen, die Abonnement- und Ereignisdaten verknüpft. Abonnementfelder in der Sicht besitzen Namen in der Form [Subscription.SubscriptionFieldName]. Eingabefelder (Ereignisfelder) besitzen Namen in der Form [Input.EventFieldName].

Abonnenten erstellen die Entsprechung der WHERE-Klausel für die Abfrage über eine Abonnementverwaltungsschnittstelle. Notification Services wertet die Bedingungsaktionen für alle relevanten Abonnements aus und generiert dann Benachrichtigungen.

Vorlage

Die folgende Transact-SQL-Vorlage zeigt, wie ein Transact-SQL-Ausdruck für eine Bedingungsaktion geschrieben wird.

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

In der SELECT-Anweisung können Sie entweder die Werte für DeviceName und SubscriberLocale aus einer Datenquelle auswählen, z. B. aus der nach der Regel benannten Sicht, oder Literalwerte angeben, z. B. 'Datei' und 'de-DE'.

Die Abfrage kann andere Anweisungen enthalten und muss keine Benachrichtigungen generieren. Die Abfrage kann alle erforderlichen Arbeiten ausführen, z. B. das Verwalten eines Verlaufs. Mindestens eine Abonnementregel sollte jedoch Benachrichtigungen generieren. Andernfalls erstellt die Anwendung keine Benachrichtigungen und verteilt sie nicht an Abonnenten.

Die INSERT-Klausel

Wie in der Vorlage dargestellt müssen Sie die folgenden Felder in der folgenden Reihenfolge in der INSERT-Anweisung angeben:

  • SubscriberId
  • DeviceName
  • SubscriberLocale

Alle nicht berechneten Felder werden im Benachrichtigungsschema definiert. Wenn Sie berechnete Felder verwenden, fügen Sie diesen Feldern keine Werte hinzu. Diese Werte werden berechnet, wenn Sie die Benachrichtigungsdaten einfügen.

Beachten Sie, dass die Werte für SubscriberId und DeviceName mit einem Datensatz in der SubscriberDevices-Tabelle übereinstimmen müssen.

Führen Sie Hinzufügungen zur Benachrichtigungstabelle nur innerhalb einer Abonnementregel aus. Beim Verarbeiten von Abonnementregeln bereitet Notification Services jede Regelauslösung vor, löst die Regeln aus und führt dann nach der Regelauslösung ein Cleanup aus. Wenn Sie versuchen, Benachrichtigungen außerhalb der Auslösung einer Abonnementregel einzufügen, finden Vorbereitung und Cleanup nicht statt. Dies verursacht Fehler.

Verwenden gespeicherter Prozeduren

Statt die Transact-SQL-Anweisungen in die Bedingungsaktion einzubetten, können Sie eine gespeicherte Prozedur aufrufen. Sie müssen die gespeicherte Prozedur in der Anwendungsdatenbank erstellen. Sie können die gespeicherte Prozedur in einem Bereitstellungsskript definieren. Sie sollten die gespeicherte Prozedur erstellen, nachdem Notification Services die Instanz erstellt oder die Anwendung hinzugefügt hat, jedoch bevor Sie die Instanz oder Anwendung aktivieren.

Zum Verwenden einer gespeicherten Prozedur ersetzen Sie den Abfragetext durch einen Aufruf der gespeicherten Prozedur. Das folgende Beispiel zeigt, wie eine gespeicherte Prozedur aufgerufen wird:

EXECUTE dbo.WeatherConditionActionSP;
So definieren Sie den Transact-SQL-Ausdruck

Schreiben von Schnittstellen der Abonnementverwaltung

Beim Schreiben von Schnittstellen der Abonnementverwaltung sollten Sie die von der Anwendung unterstützten Abonnementtypen beachten. Bei auf Bedingungen basierenden Abonnements muss der Abonnent an den Schnittstellen der Abonnementverwaltung Bedingungen eingeben können, wie beispielsweise das Auswählen eines Feldes aus einem Dropdownfeld, das Eingeben eines Operators oder das Bereitstellen eines Wertes.

Beispielcode zum Hinzufügen eines Abonnements auf Bedingungsgrundlage finden Sie unter Hinzufügen eines Abonnements.

Siehe auch

Verweis

Microsoft.SqlServer.NotificationServices.Rules

Konzepte

Definieren von Aktionen
Definieren von Ereignisregeln
Definieren von geplanten Regeln

Andere Ressourcen

INSERT (Transact-SQL)
SELECT (Transact-SQL)
Definieren von Abonnementklassen
Entwickeln von Abonnementverwaltungsschnittstellen

Hilfe und Informationen

Informationsquellen für SQL Server 2005

Änderungsverlauf

Version Verlauf

17. Juli 2006

Geänderter Inhalt:
  • Ein Abschnitt zu den Schnittstellen der Abonnementverwaltung wurde hinzugefügt.