Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Datenbankadministration » Pflege Ihrer Datenbank » Aufgaben mit Zeitplänen und Ereignissen automatisieren » Systemereignisse verstehen

 

Triggerbedingungen für Ereignisse definieren

Mit jeder Ereignisdefinition ist ein Systemereignis verknüpft. Außerdem sind ihr eine oder zwei Triggerbedingungen zugeordnet. Der Event-Handler wird ausgelöst, wenn die Triggerbedingungen für das Systemereignis eintreten.

Die Triggerbedingungen werden in die WHERE-Klausel der CREATE EVENT-Anweisung eingebaut und können mit dem Schlüsselwort AND kombiniert werden. Die Triggerbedingungen haben folgendes Format:

event_condition( Bedingungsname )	Vergleichsoperator Wert

Das Argument Bedingungsname ist eine von mehreren vordefinierten Zeichenfolgen, die den unterschiedlichen Ereignistypen entsprechen. Beispiel: Sie können DBSize (Größe der Datenbankdatei in MByte) benutzen, um eine Triggerbedingung für das Systemereignis GrowDB einzustellen. Der Datenbankserver prüft nicht, ob der Bedingungsname zum Ereignistyp passt: Sie müssen dafür Sorge tragen, dass die Bedingung im Zusammenhang mit dem Ereignistyp einen Sinn ergibt.

Beispiele
  • Das Transaktionslog soll auf 10 MByte begrenzt werden:

    CREATE EVENT LogLimit
    TYPE GrowLog
    WHERE event_condition( 'LogSize' ) > 10
    HANDLER
    BEGIN
      IF EVENT_PARAMETER( 'NumActive' ) = 1 THEN 
       BACKUP DATABASE
       DIRECTORY 'c:\\logs'
       TRANSACTION LOG ONLY
       TRANSACTION LOG RENAME MATCH;
      END IF;
    END;
  • Ein Administrator soll benachrichtigt werden, wenn der freie Speicher auf dem Medium mit der Datenbankdatei unter 10% fällt, wobei aber die Verarbeitungsroutine nur einmal alle 5 Minuten (300 Sekunden) ausgeführt werden darf:

    CREATE EVENT LowDBSpace
    TYPE DBDiskSpace
    WHERE event_condition( 'DBFreePercent' ) < 10
    AND event_condition( 'Interval' ) >= 300
    HANDLER
    BEGIN
     CALL xp_sendmail( recipient='DBAdmin',
        subject='Low disk space',
        "message"='Database free disk space '
        || EVENT_PARAMETER( 'DBFreeSpace' ) );
    END;
  • Ein Administrator soll über einen versuchten Einbruch in die Datenbank in Kenntnis gesetzt werden:

    CREATE EVENT SecurityCheck
    TYPE ConnectFailed
    HANDLER
    BEGIN
     DECLARE num_failures INT;
     DECLARE mins INT;
     INSERT INTO FailedConnections( log_time )
     VALUES ( CURRENT TIMESTAMP );
    
     SELECT COUNT( * ) INTO num_failures
     FROM FailedConnections
     WHERE log_time >= DATEADD( minute, -5,
      current timestamp );
     IF( num_failures >= 3 ) THEN
      SELECT DATEDIFF( minute, last_notification,
       current timestamp ) INTO mins
      FROM Notification;
      IF( mins > 30 ) THEN
       UPDATE Notification
       SET last_notification = current timestamp;
       CALL xp_sendmail( recipient='DBAdmin',
          subject='Security Check', "message"= 
           'over 3 failed connections in last 5 minutes' )
      END IF
     END IF
    END;
  • Ein Prozess wird ausgeführt, wenn sich der Server mehr als 10 Minuten im Leerlauf befindet. Der Prozess darf aber nicht öfter als einmal pro Stunde ausgeführt werden:

    CREATE EVENT Soak
    TYPE ServerIdle
    WHERE event_condition( 'IdleTime' ) >= 600
    AND event_condition( 'Interval' ) >= 3600
    HANDLER
    BEGIN
     MESSAGE ' Fügen Sie Ihren Code hier ein ... '
    END;