[i]文章原文见MySQL官方文档:http://dev.mysql.com/doc/refman/5.1/en/events-overview.html
英语很烂,忘海涵,若有错误,烦请指正则个:) [/i]
MySQL的Event,就是根据一个调度表运行的一系列任务。所以,我们有时也可以把它们看成是预先安排好的事件(scheduled event)。当你创建了一个事件时,其实你创建了一个或多个SQL语句,而这些语句将会隔一个或多个时间间隔进行执行,或者在某一个约定的时间开始或完成。从概念上来说,有一点像Unix的crontab (也被称作”Cron job”),也有点类似于Windows的任务调度器。
这种调度任务有时候也被称作“时间触发器”,也就是说,它们是根据特定的时间来触发的对象。当然,这样理解基本正确,但为了和Section18.3中讨论的触发器(Trigger)进行区分,我们还是称其为事件(events)。比起“时间触发器”,用“事件”显得更加针对某种特定的场景。因为触发器是指当某个特定的表上发生了某些特定的事件后才被调用执行语句的数据库对象,而时间则是由于为了响应特定的时间间隔而被执行语句的对象。(Whereas a trigger is a database object whose statements are executed in response to a specific type of event that occurs on a given table, a (scheduled) event is an object whose statements are executed in response to the passage of a specified time interval.)
然而现在还没有针对时间调度的SQL标准。不过在其他的数据库系统中已早已先例,你也许已经注意到了那些应用和MySQL中事件的相同点。
MySQL的事件有如下几个特点和属性:
? 在MySQL5.1.12(包括)之后,一个事件由它的名字和其所在的Scheme唯一确定(在之前,事件还由它的定义者决定)
? 事件根据某计划执行特定的动作(a specific action)。这个动作由一个SQL语句组成,如果需要,这个SQL语句可以是包含在BEGIN…END块之间的复合语句(Compound statement)。一个事件可以一次执行或者循环执行(one time or recurrent)。 一次执行的事件只执行一次。而循环任务则在特定的时间重复执行,针对该循环事件的计划可被设定为一个特定的开始日期和时间,也可以设定其结束的日期和时间,当然可以两者兼顾或者二者取一。(默认情况下,一个循环事件在被创建后便开始执行,并不断的循环下去,直到该事件被停止或删除 (disabled or dropped))
如果一个重复事件在它的间隔时间内没有结束, 那么该事件同时运行可能会出现多个结果。如果这是不允许的,那么你应该设计出一种机制来阻止这种同时运行的情况。比如,你可以使用GET_LOCK()函数,或对行或表进行加锁。
? 用户可以根据需要利用SQL语句创建、修改和删除事件。有语法错误的事件创建或修改语句会执行失败,并显示出对应的错误信息。某一用户有可能在该事件的执行语句中放置了其用户无权执行的语句,这样,该事件的创建和修改语句可以被成功执行,但该事件的动作却会执行失败。细节可以查看Section 18.4.6, “The Event Scheduler and MySQL Privileges”
? 用户可以通过使用SQL语句来设置或修改某一事件的多种属性,包括:事件的名字,启动时间,持久化(当它的时间表过期之后,是否保存之),状态(开启或关闭),需要执行的动作以及被分配到的Schema等等。可查看Section 12.1.2, “ALTER EVENT Syntax”.
事件的默认定义者(definer)就是创建该事件的用户。不过,当某一用户发起了最后一个作用于该事件的Alert Event语句,则其定义者就变成了此用户。一个事件也可以被任何该数据库中拥有表EVENT权限的用户修改。(不同于MySQL5.1.12,之前只有用户的定义者或者拥有mysql.event表权限的用户可以修改某一事件),具体可查看Section 18.4.6, “The Event Scheduler and MySQL Privileges”.
一个时间动作的语句包括大多数Stored routines允许的SQL语句。可查看Section E.1, “Restrictions on Stored Routines, Triggers, and Events”.
英语很烂,忘海涵,若有错误,烦请指正则个:) [/i]
MySQL的Event,就是根据一个调度表运行的一系列任务。所以,我们有时也可以把它们看成是预先安排好的事件(scheduled event)。当你创建了一个事件时,其实你创建了一个或多个SQL语句,而这些语句将会隔一个或多个时间间隔进行执行,或者在某一个约定的时间开始或完成。从概念上来说,有一点像Unix的crontab (也被称作”Cron job”),也有点类似于Windows的任务调度器。
这种调度任务有时候也被称作“时间触发器”,也就是说,它们是根据特定的时间来触发的对象。当然,这样理解基本正确,但为了和Section18.3中讨论的触发器(Trigger)进行区分,我们还是称其为事件(events)。比起“时间触发器”,用“事件”显得更加针对某种特定的场景。因为触发器是指当某个特定的表上发生了某些特定的事件后才被调用执行语句的数据库对象,而时间则是由于为了响应特定的时间间隔而被执行语句的对象。(Whereas a trigger is a database object whose statements are executed in response to a specific type of event that occurs on a given table, a (scheduled) event is an object whose statements are executed in response to the passage of a specified time interval.)
然而现在还没有针对时间调度的SQL标准。不过在其他的数据库系统中已早已先例,你也许已经注意到了那些应用和MySQL中事件的相同点。
MySQL的事件有如下几个特点和属性:
? 在MySQL5.1.12(包括)之后,一个事件由它的名字和其所在的Scheme唯一确定(在之前,事件还由它的定义者决定)
? 事件根据某计划执行特定的动作(a specific action)。这个动作由一个SQL语句组成,如果需要,这个SQL语句可以是包含在BEGIN…END块之间的复合语句(Compound statement)。一个事件可以一次执行或者循环执行(one time or recurrent)。 一次执行的事件只执行一次。而循环任务则在特定的时间重复执行,针对该循环事件的计划可被设定为一个特定的开始日期和时间,也可以设定其结束的日期和时间,当然可以两者兼顾或者二者取一。(默认情况下,一个循环事件在被创建后便开始执行,并不断的循环下去,直到该事件被停止或删除 (disabled or dropped))
如果一个重复事件在它的间隔时间内没有结束, 那么该事件同时运行可能会出现多个结果。如果这是不允许的,那么你应该设计出一种机制来阻止这种同时运行的情况。比如,你可以使用GET_LOCK()函数,或对行或表进行加锁。
? 用户可以根据需要利用SQL语句创建、修改和删除事件。有语法错误的事件创建或修改语句会执行失败,并显示出对应的错误信息。某一用户有可能在该事件的执行语句中放置了其用户无权执行的语句,这样,该事件的创建和修改语句可以被成功执行,但该事件的动作却会执行失败。细节可以查看Section 18.4.6, “The Event Scheduler and MySQL Privileges”
? 用户可以通过使用SQL语句来设置或修改某一事件的多种属性,包括:事件的名字,启动时间,持久化(当它的时间表过期之后,是否保存之),状态(开启或关闭),需要执行的动作以及被分配到的Schema等等。可查看Section 12.1.2, “ALTER EVENT Syntax”.
事件的默认定义者(definer)就是创建该事件的用户。不过,当某一用户发起了最后一个作用于该事件的Alert Event语句,则其定义者就变成了此用户。一个事件也可以被任何该数据库中拥有表EVENT权限的用户修改。(不同于MySQL5.1.12,之前只有用户的定义者或者拥有mysql.event表权限的用户可以修改某一事件),具体可查看Section 18.4.6, “The Event Scheduler and MySQL Privileges”.
一个时间动作的语句包括大多数Stored routines允许的SQL语句。可查看Section E.1, “Restrictions on Stored Routines, Triggers, and Events”.