MySQL 5.7 (Win) 和 MariaDB 10.1 (Linux),事件调度程序设置为 ON,我以 root 身份连接。
CREATE DATABASE `event-test`;
CREATE USER 'event-test'@'localhost' IDENTIFIED BY 'password-is-here';
GRANT USAGE ON *.* TO 'event-test'@'localhost';
GRANT EXECUTE, SELECT, DELETE, INSERT, UPDATE ON `event-test`.* TO 'event-test'@'localhost';
FLUSH PRIVILEGES;
USE `event-test`;
CREATE TABLE t (
v INT(11) NOT NULL
);
INSERT INTO t (v) VALUES (0);
DELIMITER //
CREATE DEFINER=`event-test`@`localhost` EVENT `e`
ON SCHEDULE
EVERY 1 MINUTE STARTS '2020-01-01 00:00:00'
ON COMPLETION NOT PRESERVE
ENABLE
DO
BEGIN
UPDATE t SET v = v + 1;
END//
DELIMITER ;
=>
已创建数据库、表和事件。 等几分钟——电视仍然为零。
错误日志中:
2020-01-13T03:30:00.184167Z 16332 [错误]事件调度程序:[event-test@localhost].[event-test.e]执行失败,用户不再具有事件权限。
2020-01-13T03:30:00.185852Z 16332 [错误]事件调度程序:[event-test@localhost][event-test.e]用户'event-test'@'localhost'对数据库'event-的访问被拒绝测试'
2020-01-13T03:30:00.187426Z 16332 [注意]事件调度程序:[event-test@localhost].[event-test.e]事件执行失败。
如果我使用命令向用户授予 EVENT 权限:
GRANT EVENT ON `event-test`.* TO 'event-test'@'localhost';
t.v 每分钟都会递增,并且日志中不再有错误。
根据MySQL手册,只有创建/更新/删除EVENT才需要EVENT权限。
所以我的问题是:我错过了什么? 为什么活动需要 EVENT 权限才能运行?
谢谢。
ON COMPLETION 子句意味着事件完成时的操作。执行该操作需要 EVENT 权限。
如果您的意图是每分钟继续执行该操作,则应完全删除该条款。
如果您的目的是仅在有限的时间内运行事件,那么您需要指定结束时间并授予用户 EVENT 权限,以便在那时删除事件。