此语句用于定义事件及其自动执行预定义操作的关联处理程序。另外,还用于定义调度操作。
CREATE EVENT 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 | "Disconnect"
| GlobalAutoincrement | GrowDB
| GrowLog | GrowTemp
| LogDiskSpace | "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 | schedule-name : identifier
day-of-week : string
day-of-month | value | period : integer
start-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 CE 或非常早的 Windows 95 版本上不支持磁盘空间事件类型。
TempDiskSpace 事件类型检查临时磁盘空间大小。
如果定义了相应的事件处理程序(DBDiskSpace、LogDiskSpace 或 TempDiskSpace),服务器将定期检查每个与数据库文件关联的设备的可用空间,间隔时间为 30 秒。类似地,如果定义了处理系统事件类型 ServerIdle 的事件,若在前一个 30 秒的时间间隔内没有要处理的请求,服务器将通知该处理程序。
您可以在启动数据库服务器时指定 -fc 选项,以在数据库服务器遇到文件系统已满时执行回调函数。
有关详细信息,请参见 -fc 服务器选项。
GlobalAutoIncrement 事件类型 如果 GLOBAL AUTOINCREMENT 的剩余值数目低于其范围的 1%,每次 插入都将触发该事件。该处理程序的典型操作可能是:基于表和提供给此事件作为参数的剩余值数目,为 GLOBAL_DATABASE_ID 选项请求新值。
对这种事件类型,可以使用以 RemainingValues 为参数的 event_condition 函数。
ServerIdle 事件类型 如果数据库包含 ServerIdle 类型的事件处理程序,则服务器每隔 30 秒检查一次服务器的活动。
WHERE 子句 此触发器条件定义事件在什么情况下触发。例如,如果希望在含有事务日志的磁盘上有 80% 以上已满时采取行动,请使用以下触发器条件:
... WHERE event_condition( 'LogDiskSpacePercentFree' ) < 20 ...
event_condition 函数的参数必须对该事件类型有效。
可以使用多个 AND 条件来构成 WHERE 子句,但不能使用 OR 条件或其它条件。
有关有效参数的信息,请参见 EVENT_CONDITION 函数 [系统]。
SCHEDULE 子句 此子句指定调度的操作何时发生。时间序列充当事件处理程序中定义的关联操作的一组触发器条件。
对给定事件及其关联的处理程序,可以定义多个调度。这样可以实现复杂的调度。有多个调度时必须提供调度名称,而仅提供一个调度时,这是可选的。
如果调度事件的定义中含有 EVERY 或 ON,则调度事件将反复出现。如果未使用这些保留字,则事件最多执行一次。如果试图创建启动时间已过去的非反复出现的调度事件,就会产生错误。
当非反复出现的调度事件过去后,将删除其调度,但不删除事件处理程序。调度事件的时间从调度创建时开始计算,并在事件处理程序完成执行时重新计算。计算下一次事件时间的方法是,检查事件的调度并找到即将到来的下一次调度时间。如果指示事件处理程序在 9:00 和 5:00 之间每隔一小时运行一次,并且它需要 65 分钟来执行,则它将分别在 9:00、11:00、1:00、3:00 和 5:00 时运行。如果希望重叠执行,必须创建多个事件。
以下是调度定义的子句:
START TIME 在调度了事件的每一天中的最初调度时间。如果指定了 START DATE,则 START TIME 引用该日期。如果未指定 START DATE,则 START TIME 在当天(除非该时间已经过去)和随后的每一天(如果调度中含有 EVERY 或 ON)。
BETWEEN ... AND 显示一天中的一段时间,在该时间段之外,没有已调度的时间。如果指定了 START DATE,则调度的时间直到该日期才发生。
EVERY 连续调度事件之间的间隔。调度的事件仅在当天的 START TIME 之后或在 BETWEEN ... AND 指定的范围内发生。
ON 调度事件发生日的列表。如果指定了 EVERY,则缺省为每天。事件发生日可指定为周内某日或月内某日。
周内某日是星期一、星期二等等。您还可以使用完整形式的日期,例如 Monday。在以下情况下,您必须使用完整形式的日期名称:您所使用的语言不是英语,不是连接字符串中客户端请求的语言,也不是服务器窗口中出现的语言。
月内某日是从 0 到 31 的整数。0 值表示任何月的最后一天。
START DATE 调度事件开始发生的日期。缺省为当前日期。
每当调度事件的处理程序完成后,即开始计算下一个调度时间和日期。
如果使用了 EVERY 子句,请查看下一个调度时间是否在当天,以及是否在 BETWEEN ... AND 范围之内。如果是,那就是下一个调度时间。
如果下一个调度时间不在当天,请查找下一个执行事件的日期。
查找指定日期的 START TIME,或 BETWEEN ... AND 范围的开始时间。
ENABLE | DISABLE 缺省情况下,事件处理程序被启用。指定 DISABLE 后,即使是在调度时间内或满足触发条件时,事件处理程序也不会执行。但是,TRIGGER EVENT 语句不 会导致被禁用的事件处理程序执行。
AT 子句 如果要在 SQL Remote 设置中的远程或统一数据库中执行事件,可以使用此子句限制在哪一个数据库中处理事件。缺省情况下,所有数据库都可以执行事件。
HANDLER 子句 每个事件都有一个处理程序。
主要有两种使用事件的方式:
调度操作 数据库服务器按时间调度执行一组操作。可以使用此功能调度备份、有效性检查、报告表填充查询等。
事件处理操作 数据库服务器在预定义的事件发生时执行一组操作。可以处理的事件包括磁盘空间限制(当磁盘使用超过了指定的百分比后)、服务器何时空闲等。
事件定义包括两个截然不同的方面。触发器条件可以是一个事件,如磁盘使用超出了定义的阈值。调度是一组时间,其中每个时间充当一个触发器条件。当满足触发器条件时,执行事件处理程序。事件处理程序包含一个或多个在复合语句 (BEGIN... END) 内指定的操作。
如果未提供触发器条件或调度说明,则只有显式 TRIGGER EVENT 语句可以触发事件。在开发中,可能需要使用 TRIGGER EVENT 来开发和测试事件处理程序,并在测试完成后添加调度或 WHERE 子句。
事件错误记录到数据库服务器主控台。
触发事件处理程序后,服务器通过使用 event_parameter 函数来使上下文信息(比如导致事件被触发的连接 ID)可供事件处理程序使用。有关 event_parameter 的详细信息,请参见 EVENT_PARAMETER 函数 [系统]。
必须具有 DBA 权限。
在事件所有者的许可下,事件处理程序在一个单独的连接上执行。要使用 DBA 以外的权限执行,可以从事件处理程序内部调用过程:过程用其所有者的权限来执行。这个单独的连接不计入个人数据库服务器只能有 10 个连接的限制中。
自动提交。
如果在执行期间未检测到任何错误,则将提交事件处理程序的操作。如果检测到错误,将回退。
SQL/92 供应商扩展。
SQL/99 供应商扩展。
Sybase 不受 Adaptive Server Enterprise 支持。
指示数据库服务器在每天凌晨 1 点,使用在 Windows NT 计算机上找到的第一个磁带驱动器执行自动磁带备份。
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有关更多示例,请参见定义事件的触发条件。
SQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。