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 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (A-D)

 

CREATE EVENT 语句

此语句用于定义事件及其自动执行预定义操作的关联处理程序,以及用于定义调度操作。

语法
CREATE EVENT [ owner.]event-name
[ TYPE event-type
         [ WHERE trigger-condition [ AND trigger-condition ] ... ]
    | SCHEDULE schedule-spec, ... ]
[ ENABLE | DISABLE ]
[ AT { CONSOLIDATED | REMOTE | 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 子句   事件名是一个标识符。事件都有创建者,即创建事件的用户。事件处理程序只能在创建者的许可下执行。这与存储过程的执行是一样的。无法创建其他用户所拥有的事件。

  • TYPE 子句   可以指定带可选 WHERE 子句的 TYPE 子句,或者指定 SCHEDULE。

    event-type 是所列出的一组系统定义事件类型中的一种。事件类型不区分大小写。要指定该 event-type 触发事件的条件,请使用 WHERE 子句。有关未在下文中列出的事件类型的说明,请参见了解系统事件

    • DiskSpace 事件类型   如果数据库包含 DiskSpace 类型之一的事件处理程序,则数据库服务器每隔 30 秒对每一个与相关文件关联的设备上的可用空间进行检查。

      如果数据库有多个 dbspace 位于不同的驱动器,则 DBDiskSpace 会检查每个驱动器并根据最低的可用空间执行操作。

      LogDiskSpace 事件类型检查事务日志和任何事务日志镜像的位置,并根据最小的可用空间进行报告。

      Windows Mobile 不支持磁盘空间事件类型。

      TempDiskSpace 事件类型检查临时磁盘空间的大小。

      如果定义了相应的事件处理程序(DBDiskSpace、LogDiskSpace 或 TempDiskSpace),则数据库服务器每隔 30 秒便会检查一次每个与数据库文件关联的设备的可用空间。同样,在定义了处理系统事件类型 ServerIdle 的事件后,如果在前 30 秒内未处理任何请求,则数据库服务器将通知该处理程序。

      您可以在启动数据库服务器时指定 -fc 选项,以在数据库服务器遇到文件系统已满时执行回调函数。

      请参见-fc 服务器选项

    • GlobalAutoIncrement 事件类型   如果 GLOBAL AUTOINCREMENT 的剩余值数目低于其范围末尾的 1%,则每次 进行插入时都将触发此事件。处理程序的典型操作可能是:基于表和提供给此事件作为参数的剩余值数,为 global_database_id 选项请求新值。

      对这种事件类型,可以使用以 RemainingValues 为参数的 event_condition 函数。

    • ServerIdle 事件类型   如果数据库包含 ServerIdle 类型的事件处理程序,则数据库服务器每隔 30 秒便会检查一次服务器的活动。

    • 数据库镜像事件类型   当主数据库服务器与镜像服务器或仲裁服务器之间的连接丢失时会触发 MirrorServerDisconnect 事件,且只要服务器取得数据库所有权就会触发 MirrorFailover 事件。请参见数据库镜像系统事件

  • WHERE 子句   此触发条件确定在什么情况下触发事件。例如,如果希望在含有事务日志的磁盘上有 80% 以上已满时执行操作,请使用以下触发条件:
    ...
    WHERE event_condition( 'LogDiskSpacePercentFree' ) < 20
    ...

    event_condition 函数的参数必须对该事件类型有效。

    可以使用多个 AND 条件来构成 WHERE 子句,但不能使用 OR 条件或其它条件。

    有关有效参数的信息,请参见EVENT_CONDITION 函数 [System]

  • SCHEDULE 子句   此子句指定调度操作发生的时间。时间序列充当事件处理程序中定义的关联操作的一组触发条件。

    可以为给定事件及其关联的处理程序创建多个调度。这样可以实现复杂的调度。有多个调度时必须提供调度名称,而仅提供一个调度时,这是可选的。

    如果调度事件的定义中含有 EVERY 或 ON,则调度事件将反复出现;如果未使用这些保留字,则事件最多会执行一次。如果试图创建开始时间为过去时间的非反复出现调度事件,将会出现错误。在非反复出现的调度事件已过去之后,将删除其调度,但不删除事件处理程序。

    调度事件的时间从调度创建时开始计算,并在事件处理程序完成执行时重新计算。调度事件的时间从调度创建时开始计算,并在事件处理程序完成执行时重新计算。如果指示事件处理程序在 9:00 和 5:00 之间每隔一小时运行一次,并且它需要 65 分钟来执行,则它将分别在 9:00、11:00、1:00、3:00 和 5:00 运行。如果要重叠执行,则必须创建多个事件。

以下是调度定义的子句:

  • START TIME 子句   调度事件的每天中的最初调度时间。start-time 参数为字符串,不能为变量或表达式,如 NOW()。如果指定了 START DATE,则 START TIME 引用该日期。如果未指定 START DATE,则 START TIME 在当天(除非该时间已经过去)和随后的每一天(如果调度中含有 EVERY 或 ON)。

  • BETWEEN ...AND 子句   显示一天中的一段时间,在该时间段之外,没有调度的时间。start-timeend-time 参数为字符串,不能为变量或表达式,如 NOW()。如果指定了 START DATE,则调度的时间直到该日期才存在。

  • EVERY 子句   连续调度事件之间的间隔。调度的事件仅在当天的 START TIME 之后或在 BETWEEN ...AND 指定的范围内发生。

  • ON 子句   调度事件发生日的列表。如果指定了 EVERY,则缺省为每天。事件发生日可指定为周内某日或月内某日。

    周内某日是周一、周二等等。您还可以使用完整形式的日期,例如 Monday。当您所使用的语言不是英语、不是连接字符串中客户端请求的语言、也不是数据库服务器消息窗口中出现的语言时,您必须使用完整形式的日期名。

    月内某日是从 0 到 31 的整数。0 值表示任何月的最后一天。

  • START DATE 子句   调度事件开始发生的日期。此参数为字符串,不能为变量或表达式,如 TODAY()。缺省为当前日期。

    每当调度事件的处理程序完成后,即开始计算下一个调度时间和日期。

    1. 如果使用了 EVERY 子句,则查看下次调度时间是否在当天,以及是否在 BETWEEN ...AND 范围的开始时间。如果是,即为下次调度时间。

    2. 如果下一个调度时间不在当天,请查找下一个执行事件的日期。

    3. 查找此日期的 START TIME,或 BETWEEN ...AND 范围的开始时间。

  • ENABLE | DISABLE 子句   缺省情况下,启用事件处理程序。指定 DISABLE 后,即使是在调度时间内或满足触发条件时,事件处理程序也不会执行。但是,TRIGGER EVENT 语句 会导致已禁用的事件处理程序被执行。

  • AT 子句   应只在以下情况下使用此语句:在 SQL Remote 设置中,可对远程或统一数据库使用此子句,以限制在哪一个数据库中处理事件。

    如果为 SQL Remote 创建事件时没有使用 AT 子句,那么所有数据库都会执行事件。当在统一数据库上执行时,此语句不会影响已被提取的远程数据库。

  • HANDLER 子句   每个事件都有一个处理程序。

注释

主要有两种使用事件的方式:

  • 调度操作   数据库服务器按时间表执行操作。可使用此功能完成计划任务,如备份、有效性检查和用于将数据添加到报告表的查询。

  • 事件处理操作   数据库服务器在发生预定义事件时执行操作。可使用此功能完成计划任务,例如在磁盘使用超过了指定的百分比时限制磁盘空间。如果在执行期间未检测到错误,则提交事件处理程序操作;如果检测到错误,则回退。

事件定义包括两个截然不同的方面。触发器条件可以是一个事件,如磁盘使用超出了定义的阈值。调度是一组时间,其中每个时间充当一个触发器条件。当满足触发器条件时,执行事件处理程序。事件处理程序包含一个或多个在复合语句 (BEGIN...END) 内声明 SQL 变量。

如果未提供触发条件或调度说明,则只有显式 TRIGGER EVENT 语句才能触发事件。在开发过程中,您可能要使用 TRIGGER EVENT 测试事件处理程序,并可能要在测试完成后添加调度或 WHERE 子句。

任何事件错误都会记录到数据库服务器消息日志中。请参见记录数据库服务器操作

每次执行事件处理程序后,如果没有出现错误便会发生 COMMIT。如果出现错误,则会发生 ROLLBACK。

触发事件处理程序后,数据库服务器通过使用 event_parameter 函数,来使上下文信息(例如导致事件被触发的连接 ID)可供事件处理程序使用。有关 event_parameter 的详细信息,请参见EVENT_PARAMETER 函数 [System]

权限

必须具有 DBA 权限。

在事件所有者的许可下,事件处理程序在一个单独的连接上执行。要使用 DBA 以外的权限进行执行,可以从事件处理程序内调用过程:使用过程所有者的权限执行过程。此单独连接不计入个人数据库服务器只能有 10 个连接的限制中。

副作用

自动提交。

另请参见
标准和兼容性
  • SQL/2003   服务商扩充。

示例

指示数据库服务器在每天凌晨 1 点,使用第一个磁带驱动器执行自动的磁带备份。

CREATE EVENT DailyBackup
SCHEDULE daily_backup
START TIME '1:00AM' EVERY 24 HOURS
HANDLER
   BEGIN
      BACKUP DATABASE TO '\\\\.\\tape0'
      ATTENDED OFF
   END;

指示数据库服务器从星期一到星期五,在每天上午 8 点到下午 6 点之间,每隔一小时执行一次仅对事务日志的自动备份。

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;

请参见定义事件的触发条件