Definiert ein Ereignis und den zugehörigen Handler zum Automatisieren vordefinierter Aktionen und definiert geplante Aktionen.
CREATE EVENT [ owner.]event-name [ TYPE event-type [ WHERE trigger-condition [ AND trigger-condition ] ... ] | SCHEDULE schedule-spec, ... ] [ ENABLE | DISABLE ] [ AT { CONSOLIDATED | REMOTE | ALL } ] [ FOR { PRIMARY | ALL } ] [ HANDLER BEGIN ... END ]
event-type : BackupEnd | Connect | ConnectFailed | DatabaseStart | DBDiskSpace | Deadlock | "Disconnect" | GlobalAutoincrement | GrowDB | GrowLog | GrowTemp | LogDiskSpace | MirrorFailover | MirrorServerDisconnect | RAISERROR | ServerIdle | TempDiskSpace
trigger-condition : event_condition( condition-name ) { = | < | > | != | <= | >= } value
schedule-spec : [ schedule-name ] { START TIME start-time | BETWEEN start-time AND end-time } [ EVERY period { HOURS | MINUTES | SECONDS } ] [ ON { ( day-of-week, ... ) | ( day-of-month, ... ) } ] [ START DATE start-date ]
event-name : identifier
schedule-name : identifier
day-of-week : string
day-of-month : integer
value : integer
period : integer
start-time : time
end-time : time
start-date : date
CREATE EVENT-Klausel Der Ereignisname ist ein Bezeichner. Ein Ereignis hat einen Ersteller: den Benutzer, der das Ereignis erstellt hat. Der Event-Handler wird mit den Privilegien dieses Erstellers ausgeführt. Die Ausführung ist dieselbe wie bei gespeicherten Prozeduren. Sie können keine Ereignisse erstellen, die anderen Benutzern gehören.
TYPE-Klausel Sie können die TYPE-Klausel mit einer optionalen WHERE-Klausel angeben oder SCHEDULE festlegen.
Der event-type ist einer der aufgelisteten systemdefinierten Ereignistypen. Bei Ereignistypen wird die Groß-/Kleinschreibung nicht berücksichtigt. Die Bedingungen, unter welchen dieser event-type ein Ereignis auslöst, legen Sie mit der WHERE-Klausel fest.
DiskSpace-Ereignistypen Wenn die Datenbank einen Event-Handler für einen der DiskSpace-Typen enthält, prüft der Datenbankserver alle 30 Sekunden den verfügbaren Speicherplatz auf jedem Medium, das der entsprechenden Datei zugeordnet ist.
Falls die Datenbank über mehr als einen DBSpace auf verschiedenen Laufwerken verfügt, prüft DBDiskSpace jedes Laufwerk und handelt abhängig vom kleinsten verfügbaren Speicherplatz.
Der Ereignistyp LogDiskSpace prüft den Speicherort des Transaktionslogs und aller Transaktionslogspiegel und gibt eine Meldung basierend auf dem kleinsten verfügbaren Speicherplatz aus.
DiskSpace-Ereignistypen werden unter Windows Mobile nicht unterstützt.
Der Ereignistyp TempDiskSpace prüft den Umfang des temporären Festplattenspeichers.
Wenn die geeigneten Ereignis-Handler definiert wurden (DBDiskSpace, LogDiskSpace oder TempDiskSpace), prüft der Datenbankserver alle 30 Sekunden den verfügbaren Speicher auf jedem Medium, das mit einer Datenbankdatei verbunden ist. Wenn ein Ereignis definiert wurde, um den Systemereignistyp ServerIdle zu verarbeiten, benachrichtigt der Datenbankserver den Handler, wenn während der abgelaufenen 30 Sekunden keine Anforderungen verarbeitet wurden.
Sie können die Option -fc beim Starten des Datenbankservers angeben, um eine Callback-Funktion zu implementieren, wenn der Datenbankserver Speichermangel im Dateisystem feststellt.
GlobalAutoIncrement-Ereignistyp Das Ereignis wird bei jeder Einfügung ausgelöst, wenn die Anzahl der verbleibenden Werte für GLOBAL AUTOINCREMENT geringer als 1% des Endbereichs ist. Eine typische Aktion für den Handler könnte darin bestehen, einen neuen Wert für die Option global_database_id basierend auf der Tabelle und der Anzahl der restlichen Werte anzufordern, die als Parameter für dieses Ereignis bereitgestellt wurden.
Sie können die Funktion event_condition mit RemainingValues als Argument für diesen Ereignistyp verwenden.
ServerIdle-Ereignistyp Wenn die Datenbank einen Event-Handler für den Typ ServerIdle enthält, prüft der Datenbankserver die Serveraktivität alle 30 Sekunden.
Datenbankspiegelungs-Ereignistypen Das MirrorServerDisconnect-Ereignis wird ausgelöst, wenn eine Verbindung vom Primärdatenbankserver zum Spiegel- bzw. Arbiterserver verloren geht, und das MirrorFailover-Ereignis wird ausgelöst, wenn ein Server Eigentümer der Datenbank wird.
WHERE-Klausel Die Triggerbedingung bestimmt die Bedingung, unter der ein Ereignis ausgelöst wird. Um z.B. eine Aktion auszuführen, wenn der Plattenspeicher mit dem Transaktionslog mehr als 80% voll ist, verwenden Sie die folgende Trigger-auslösende Bedingung:
... WHERE event_condition( 'LogFreePercent' ) < 20 ... |
Das Argument der Funktion event_condition muss für den Ereignistyp gültig sein.
Sie können mehrere AND-Bedingungen für die WHERE-Klausel verwenden, OR-Bedingungen oder andere Bedingungen sind nicht zulässig.
SCHEDULE-Klausel Diese Klausel legt fest, wann geplante Aktionen stattfinden sollen. Die zeitliche Abfolge wird als eine Reihe von Trigger-auslösenden Bedingungen für die zugeordneten Aktionen behandelt, die im Event-Handler definiert sind.
Sie können mehr als einen Abfolgeplan für ein bestimmtes Ereignis und seine Verarbeitungsroutine erstellen. Damit können komplexe Abfolgen implementiert werden. Während Sie bei mehreren Abfolgeplänen einen schedule-name angeben müssen, ist der schedule-name bei einem einzigen Plan optional.
Ein geplantes Ereignis wiederholt sich, sobald seine Definition EVERY oder ON enthält. Wenn keines dieser Wörter verwendet wird, wird das Ereignis höchstens einmal ausgeführt. Beim Versuch, ein sich nicht-wiederholendes geplantes Ereignis zu erstellen, für das der Startzeitpunkt verstrichen ist, wird ein Fehler generiert. Wenn ein sich nicht-wiederholendes geplantes Ereignis abgelaufen ist, wird sein Abfolgeplan gelöscht, der Event-Handler jedoch nicht.
Die Zeiten für geplante Ereignisse werden berechnet, wenn die Abfolgepläne erstellt werden, und nochmals, wenn die Ausführung des Event-Handlers beendet wird. Die nächste Ereigniszeit wird berechnet, indem der Abfolgeplan oder die Pläne für das Ereignis untersucht werden und der nächste geplante Zeitpunkt ermittelt wird. Wenn ein Event-Handler angewiesen wird, jede Stunde zwischen 9:00 und 17:00 abzulaufen, und die Ausführung 65 Minuten dauert, findet diese um 9:00, 11:00, 13:00, 15:00 und 17:00 statt. Wenn sich die Ausführung überschneiden soll, müssen Sie mehr als ein Ereignis erstellen.
Die Unterklauseln einer Planungsdefinition lauten folgendermaßen:
START TIME-Klausel
Der erste geplante Zeitpunkt für jeden Tag, an dem das Ereignis geplant ist. Der Parameter start-time ist eine Zeichenfolge und kann keine Variable und kein Ausdruck wie NOW()
sein. Wenn START DATE angegeben wird, bezieht sich START TIME auf dieses Datum und jeden nachfolgenden Tag (sofern der Zeitplan
EVERY oder ON enthält). Wenn START DATE nicht angegeben wurde, umfasst START TIME den aktuellen Tag (falls der Zeitpunkt noch
nicht überschritten wurde) und alle darauf folgenden Tage (falls die Planung EVERY oder ON enthält). Die Klausel START TIME
start-time ist gleichwertig mit BETWEEN start-time AND '23:59:59'.
BETWEEN...AND-Klausel
Ein Zeitabschnitt im Tagesverlauf, außerhalb dessen keine geplanten Zeitpunkte vorliegen. Die Parameter start-time und end-time sind Zeichenfolgen und können keine Variablen oder Ausdrücke wie NOW()
sein. Wenn START DATE angegeben wurde, beginnen die geplanten Zeitpunkte erst ab diesem Datum.
EVERY-Klausel Ein Intervall zwischen aufeinanderfolgenden geplanten Ereignissen. Geplante Ereignisse treten erst nach der unter START TIME angegebenen Startzeit für den Tag auf oder liegen in dem Bereich, der mit BETWEEN…AND festgelegt wurde.
ON-Klausel Eine Liste von Tagen, an denen die geplanten Ereignisse eintreten. Der Standardwert ist täglich, sofern EVERY angegeben ist. Die Tage können als Tage der Woche oder des Monats angegeben werden.
Wochentage sind Montag, Dienstag etc. Sie können die Tage abgekürzt oder in Langform eingeben. Die Langform müssen Sie jedoch verwenden, wenn die verwendete Sprache nicht Englisch ist, nicht die vom Client in der Verbindungszeichenfolge verlangte Sprache ist, und nicht die Sprache ist, die im Meldungsfenster des Datenbankservers erscheint.
Monatstage sind Ganzzahlen zwischen 0 und 31. Ein Wert von "0" steht für den letzten Tag eines Monats.
START DATE-Klausel
Das Datum, an dem geplante Ereignisse zum ersten Mal eintreten sollen. Dieser Wert ist eine Zeichenfolge und kann keine
Variable und kein Ausdruck wie TODAY()
sein. Der Standardwert ist das aktuelle Datum.
Jedes Mal, wenn ein geplanter Event-Handler abgeschlossen ist, werden die folgenden Aktionen ausgeführt, um die nächste geplante Zeit und das Datum für das Ereignis zu berechnen:
Bei Verwendung der EVERY-Klausel muss festgestellt werden, ob der nächste geplante Zeitpunkt auf den aktuellen Tag fällt und (sofern dieser angegeben wurde) vor dem Ende des Bereichs BETWEEN…AND liegt. Wenn ja, ist dies der nächste geplante Zeitpunkt.
Wenn der nächste geplante Zeitpunkt nicht auf den aktuellen Tag fällt, wird das nächste Datum, an dem das Ereignis ausgeführt werden soll, ermittelt und START TIME oder der Beginn des BETWEEN...AND-Bereichs für dieses Datum verwendet.
ENABLE | DISABLE-Klausel Standardmäßig sind Event-Handler aktiviert. Wenn DISABLE angegeben ist, wird der Event-Handler nicht ausgeführt, selbst wenn der geplante Zeitpunkt erreicht wird oder die Trigger-auslösende Bedingung eintritt. Eine TRIGGER EVENT-Anweisung kann einen deaktivierten Event-Handler nicht zur Ausführung zwingen.
AT-Klausel Diese Klausel sollte nur unter folgenden Umständen verwendet werden: In einer SQL Remote-Umgebung verwenden Sie die AT-Klausel für die entfernten oder konsolidierten Datenbanken, um die Datenbanken zu begrenzen, in denen das Ereignis verarbeitet werden soll.
Wenn Sie die AT-Klausel beim Erstellen von Ereignissen für SQL Remote nicht verwenden, führen alle Datenbanken das Ereignis aus. Wenn diese Anweisung in einer konsolidierten Datenbank ausgeführt wird, hat sie keine Auswirkungen auf entfernte Datenbanken, die bereits extrahiert wurden.
FOR-Klausel Diese Klausel sollte nur unter folgenden Umständen verwendet werden: Verwenden Sie in einem Datenbankspiegelungssystem oder einem Scale-Out-System mit Schreibschutz die FOR-Klausel, um die Datenbanken einzuschränken, in denen der Event-Handler ausgeführt wird.
Wenn Sie ein Ereignis für eine Datenbank in einem Spiegelungssystem oder einem Scale-Out-System mit Schreibschutz ohne die FOR-Klausel erstellen, wird das Ereignis nur von der Datenbank ausgeführt, die auf dem Primärserver läuft. Folgende Unterklauseln werden unterstützt:
FOR PRIMARY Das Ereignis wird nur auf dem Server ausgeführt, der derzeit als Primärserver fungiert. Der Standardwert ist die PRIMARY-Unterklausel.
Wenn die FOR PRIMARY-Klausel zusammen mit dem DatabaseStart-Ereignistyp verwendet wird (oder die FOR-Klausel nicht angegeben wurde), wird das Ereignis ausgeführt, wenn ein Server die Rolle des Primärservers für die Datenbank übernimmt.
FOR ALL Das Ereignis wird auf allen Servern im System ausgeführt.
Wenn die FOR ALL-Klausel zusammen mit dem DatabaseStart-Ereignistyp verwendet wird, wird das Ereignis beim Starten einer beliebigen Datenbank ausgeführt. Wenn in einem Spiegelungssystem das Ereignis nicht beim Starten der Datenbank ausgeführt wurde (z.B. weil die Datenbank ausgeführt wurde, bevor das Ereignis erstellt wurde), kann das Ereignis während eines Failovers ausgeführt werden. Beispiel: Sie starten ein Datenbankspiegelungssystem, erstellen ein DatabaseStart-Ereignis mit der FOR ALL-Klausel und stoppen anschließend den Primärserver, was einen Failover verursacht. In diesem Beispiel wird das Ereignis auf dem neuen Primärserver ausgeführt. Das DatabaseStart-Ereignis wird bei einem nachfolgenden Failover nicht ausgeführt.
HANDLER-Klausel Jedes Ereignis umfasst eine Verarbeitungsroutine.
Ereignisse können für folgende Zwecke verwendet werden:
Geplante Aktionen Der Datenbankserver führt Aktionen nach einem Zeitplan durch. Sie können diese Fähigkeit nutzen, um geplante Aufgaben wie Sicherungen, Gültigkeitsprüfungen und Abfragen durchzuführen, die verwendet werden, um Daten in Berichtstabellen einzufügen.
Aktionen zur Ereignisverarbeitung Der Datenbankserver führt Aktionen aus, wenn ein vordefiniertes Ereignis eintritt. Sie können diese Fähigkeit verwenden, um geplante Aufgaben durchzuführen, etwa die Limitierung von Festplattenspeicher, wenn eine Datei über einen bestimmten Prozentsatz hinaus anwächst. Aktionen von Event-Handlern werden festgeschrieben, wenn während des Ausführens keine Fehler erkannt werden, und zurückgesetzt, wenn Fehler auftreten.
Eine Ereignisdefinition umfasst zwei unterschiedliche Bestandteile. Die Triggerbedingung kann ein auftretendes Ereignis sein, wie z.B. das Überschreiten eines bestimmten Grenzwerts für einen Plattenspeicher. Ein Abfolgeplan ist eine Reihe von Zeiten, die alle als Triggerbedingung gehandhabt werden. Wenn eine Triggerbedingung erfüllt ist, wird der Event-Handler ausgeführt. Der Event-Handler umfasst eine oder mehrere festgelegte Aktionen innerhalb einer zusammengesetzten Anweisung (BEGIN… END).
Wenn keine Triggerbedingung oder Planungsspezifikation angegeben wird, kann nur eine explizite TRIGGER EVENT-Anweisung das Ereignis auslösen. Während der Entwicklung können Sie Event-Handler mithilfe von TRIGGER EVENT testen. Den Abfolgeplan oder die WHERE-Klausel fügen Sie hinzu, sobald der Test abgeschlossen ist.
Ereignisfehler werden im Datenbankserver-Meldungslog protokolliert.
Nach jeder Ausführung eines Event-Handlers wird ein COMMIT ausgeführt, falls kein Fehler aufgetreten ist. Wenn es einen Fehler gegeben hat, wird ein ROLLBACK ausgeführt.
Wenn Event-Handler ausgelöst werden, stellt der Datenbankserver dem Event-Handler mit der Funktion event_parameter Kontextinformationen bereit, wie z.B. die Verbindungs-ID, die das Ereignis ausgelöst hat.
Event-Handler werden auf einer separaten Verbindung ausgeführt, aber die separate Verbindung zählt nicht zu den zehn Verbindungen, auf die der Personal Datenbankserver beschränkt ist.
Sie müssen das MANAGE ANY EVENT-Systemprivileg oder das CREATE ANY OBJECT-Systemprivileg haben.
Automatisches Festschreiben (Autocommit).
SQL/2008 Erweiterung des Herstellers.
Weisen Sie den Datenbankserver an, jeden Tag um 1:00 Uhr eine automatische Sicherung auf Band unter Verwendung des ersten Bandlaufwerks auszuführen.
CREATE EVENT DailyBackup SCHEDULE daily_backup START TIME '1:00AM' EVERY 24 HOURS HANDLER BEGIN BACKUP DATABASE TO '\\\\.\\tape0' ATTENDED OFF END; |
Weisen Sie den Datenbankserver an, täglich um 1:00 Uhr eine inkrementelle Sicherung ausführen.
CREATE EVENT IncrementalBackup SCHEDULE START TIME '1:00 AM' EVERY 24 HOURS HANDLER BEGIN BACKUP DATABASE DIRECTORY 'c:\\backup' TRANSACTION LOG ONLY TRANSACTION LOG RENAME MATCH END; |
Weisen Sie den Datenbankserver an, montags bis freitags zwischen 8 und 18 Uhr jede Stunde eine automatische Sicherung nur für das Transaktionslog auszuführen.
CREATE EVENT HourlyLogBackup SCHEDULE hourly_log_backup BETWEEN '8:00AM' AND '6:00PM' EVERY 1 HOURS ON ('Monday','Tuesday','Wednesday','Thursday','Friday') HANDLER BEGIN BACKUP DATABASE DIRECTORY 'c:\\database\\backup' TRANSACTION LOG ONLY TRANSACTION LOG RENAME END; |
Ermitteln Sie, wann ein Ereignis das nächste Mal ausgeführt werden soll:
SELECT DB_EXTENDED_PROPERTY( 'NextScheduleTime', 'HourlyLogBackup'); |
Erstellen Sie ein Ereignis, das auf jedem Server in einem Spiegelungssystem oder einem Scale-Out-System mit Schreibschutz ausgeführt werden kann.
CREATE EVENT evt1 FOR ALL HANDLER BEGIN MESSAGE CURRENT TIME || ' evt1 active' TO CONSOLE; END |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |