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

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 数据库管理 » 维护数据库 » 使用调度和事件自动完成任务 » 了解系统事件

 

定义事件的触发条件

每个事件定义都有一个与其关联的系统事件。它也有一个或多个触发条件。在满足系统事件的触发条件时,会触发事件处理程序。

触发条件包括在 CREATE EVENT 语句的 WHERE 子句中,可以使用 AND 关键字对触发条件进行组合。每个触发条件的形式如下:

event_condition( condition-name ) comparison-operator value

condition-name 参数是一组预置字符串中的一个字符串,这些字符串适用于不同的事件类型。例如,您可以使用 DBSize(以兆字节为单位的数据库文件大小)来构建适合于 GrowDB 系统事件的触发条件。数据库服务器不检查条件名是否与事件类型匹配:您应负责确保该条件在事件类型上下文中有意义。

示例
  • 将事务日志的大小限制到 10 MB:

    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;
  • 当数据库文件所在设备上的可用磁盘空间低于 10% 时,通知管理员,但执行处理程序的频率不超过每五分钟(即 300 秒)一次:

    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;
  • 通知管理员可能有人试图入侵数据库:

    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;
  • 在服务器已经空闲十分钟时运行一个进程。执行频率不要超过每小时一次:

    CREATE EVENT Soak
    TYPE ServerIdle
    WHERE event_condition( 'IdleTime' ) >= 600
    AND event_condition( 'Interval' ) >= 3600
    HANDLER
    BEGIN
     MESSAGE ' Insert your code here ... '
    END;