CREATE EVENT
功能描述
CREATE EVENT
用于创建一个新的定时任务。
注意事项
该功能仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。
用户操作(创建/修改/删除)定时任务时,非sysadmin用户需要被sysadmin用户赋予操作定时任务的权限。定时任务操作权限与高级包DBE_SCHEDULER中创建定时任务赋权操作一致。
定时任务时间间隔interval表达式目前兼容了浮点数语法,例如
interval 0.5 minute
,但是计算时会将浮点数取整,所以不建议interval时间间隔使用浮点数形式。同一database下不支持同名定时任务。
定时任务中待执行语句范围是除安全相关操作以外任意SQL语句,但对于某些有约束的语句会执行失败。例如:不支持通过复合语句创建database。
定时任务待执行语句不支持的安全相关操作范围主要包括:
- 使用加密函数。
- 创建或设置用户、group。
- 连接数据库。
- 函数加密等。
定时任务指定definer选项在以下场景下会指定失败:
- 操作定时任务的用户不具有sysadmin权限。
当前用户与被指定definer不一致时:
- 指定definer为初始用户。
- 指定definer为私有用户、运维管理员、监控管理员。
- 开启三权分立:enable_separation_of_duty=on。
语法格式
CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name_str
ON SCHEDULE schedule_expr
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
DO event_body;
schedule_expr:
AT timestamp_expr [+ INTERVAL interval_expr] ... | EVERY interval_expr [STARTS timestamp_expr [+ INTERVAL timestamp_expr] ...] [ENDS timestamp_expr [+ INTERVAL interval_expr] ...]
interval_expr:
quantity {YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY TO SECOND | HOUR TO MINUTE | HOUR TO SECOND | MINUTE TO SECOND}
参数说明
DEFINER
定时任务待执行语句在执行时使用的权限。默认情况下使用当前创建定时任务者的权限,当definer被指定时,使用被指定用户用户权限。
definer参数只有具有sysadmin权限的用户有权指定。
IF NOT EXISTS
如果系统已经存在一个同名的定时任务,不会报错,而是会给出一个提示。
ON SCHEDULE schedule_expr
定时任务执行时刻。定时任务可以通过schedule设置为执行一次,也可以设置为执行多次:
- ** AT timestamp_expr [+ INTERVAL interval_expr]**:表示设置定时任务只在timestamp_expr [+ INTERVAL interval_expr]时间点执行一次。
VERY interval_expr:表示设置定时任务在每隔interval_expr时间后重复执行。
- STARTS timestamp_expr [+ INTERVAL timestamp_expr] :用户可以给可重复执行的定时任务指定起始时间,即定时任务从
timestamp_expr [+ INTERVAL timestamp_expr]
时刻开始执行。当此参数为空时默认从当前时刻开始执行。 - ENDS timestamp_expr [+ INTERVAL timestamp_expr]:用户可以给可重复执行的定时任务指定结束时间,即定时任务从
timestamp_expr [+ INTERVAL timestamp_expr]
时刻停止执行。当此参数为空时默认为3999-12-31 16:00:00。
- STARTS timestamp_expr [+ INTERVAL timestamp_expr] :用户可以给可重复执行的定时任务指定起始时间,即定时任务从
INTERVAL
时间间隔,interval由quantity数字和时间单位组成,例如
1 YEAR
。ON COMPLETION [NOT] PRESERVE
默认情况下,一旦事务处于完成状态,系统表中就会立刻删除该定时任务。用户可以通过设置
ON COMPLETION PRESERVE
来覆盖默认行为。ENABLE | DISABLE | DISABLE ON SLAVE
创建定时任务后,定时任务默认处于ENABLE状态,即到规定时间立即执行待执行语句。用户可以使用DISABLE关键字,改变定时任务的活动状态。
DISABLE ON SLAVE
表现与DISABLE一致。COMMENT
用户可以给定时任务添加注释,注释内容在GS_JOB_ATTRIBUTE表中查看。
DO
定时任务待执行语句。
示例
1、创建测试表。
CREATE TABLE t_ev(num int);
2、创建一个执行一次的定时任务。
CREATE EVENT IF NOT EXISTS event_e1 ON SCHEDULE AT now() + interval 5 second + interval 33 minute DISABLE DO insert into t_ev values(0);
3、创建一个每隔一分钟执行一次的定时任务。
CREATE EVENT IF NOT EXISTS event_e2 ON SCHEDULE EVERY 1 minute DO insert into t_ev values(1);
4、查看定时任务。
SHOW EVENTS;
返回结果如下:
job_name | schema_name | log_user | priv_user | job_status | start_date | interval | end_date | enable | failure_msg
----------+-------------+----------+-----------+------------+----------------------------+----------------------+---------------------+--------+-------------
event_e1 | public | vastbase | vastbase | s | 2023-08-17 17:43:08 | null | 3999-12-31 16:00:00 | f |
event_e2 | public | vastbase | vastbase | s | 2023-08-17 17:10:10.043526 | interval '1' minute | 3999-12-31 16:00:00 | t |
(2 rows)
- 定时任务创建完成后如果执行失败,失败原因可以通过SHOW EVENTS或在PG_JOB表中查看。
- 当定时任务的待执行语句中进行涉及用户密码相关操作时(创建弱口令等),系统表及中会记录密码的明文。因此不建议用户在定时任务的待执行语句中进行涉及用户密码的相关操作。