若要啟用或停用排程事件的執行,必須設定全域 event_scheduler 系統變數的值。這需要足夠的權限才能設定全域系統變數。請參閱 第 7.1.9.1 節「系統變數權限」。
EVENT 權限管控事件的建立、修改與刪除。可以使用 GRANT 授予此權限。例如,此 GRANT 陳述式將名為 myschema 的綱要的 EVENT 權限授予使用者 jon@ghidora
GRANT EVENT ON myschema.* TO jon@ghidora;(我們假設此使用者帳戶已存在,且我們希望它保持不變。)
若要授予此使用者在所有綱要上的 EVENT 權限,請使用下列陳述式
GRANT EVENT ON *.* TO jon@ghidora;EVENT 權限具有全域或綱要層級範圍。因此,嘗試在單一表格上授予它會導致錯誤,如下所示
mysql> GRANT EVENT ON myschema.mytable TO jon@ghidora;
ERROR 1144 (42000): Illegal GRANT/REVOKE command; please
consult the manual to see which privileges can be used必須了解,事件會使用其定義者的權限執行,並且它無法執行任何其定義者不具備所需權限的動作。例如,假設 jon@ghidora 具有 myschema 的 EVENT 權限。也假設此使用者具有 myschema 的 SELECT 權限,但此綱要的其他權限則無。 jon@ghidora 可以建立一個新的事件,如下所示
CREATE EVENT e_store_ts
ON SCHEDULE
EVERY 10 SECOND
DO
INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP());使用者等待大約一分鐘,然後執行 SELECT * FROM mytable; 查詢,期望在表格中看到一些新的資料列。相反地,表格是空的。由於使用者不具備問題表格的 INSERT 權限,因此事件沒有任何作用。
如果您檢查 MySQL 錯誤日誌 (),您可以看到事件正在執行,但它嘗試執行的動作失敗hostname.err
2013-09-24T12:41:31.261992Z 25 [ERROR] Event Scheduler:
[jon@ghidora][cookbook.e_store_ts] INSERT command denied to user
'jon'@'ghidora' for table 'mytable'
2013-09-24T12:41:31.262022Z 25 [Note] Event Scheduler:
[jon@ghidora].[myschema.e_store_ts] event execution failed.
2013-09-24T12:41:41.271796Z 26 [ERROR] Event Scheduler:
[jon@ghidora][cookbook.e_store_ts] INSERT command denied to user
'jon'@'ghidora' for table 'mytable'
2013-09-24T12:41:41.272761Z 26 [Note] Event Scheduler:
[jon@ghidora].[myschema.e_store_ts] event execution failed.由於此使用者很可能無法存取錯誤日誌,因此可以透過直接執行事件的動作陳述式來驗證其是否有效
mysql> INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP());
ERROR 1142 (42000): INSERT command denied to user
'jon'@'ghidora' for table 'mytable'檢查 Information Schema EVENTS 表格會顯示 e_store_ts 存在且已啟用,但其 LAST_EXECUTED 欄為 NULL
mysql> SELECT * FROM INFORMATION_SCHEMA.EVENTS
> WHERE EVENT_NAME='e_store_ts'
> AND EVENT_SCHEMA='myschema'\G
*************************** 1. row ***************************
EVENT_CATALOG: NULL
EVENT_SCHEMA: myschema
EVENT_NAME: e_store_ts
DEFINER: jon@ghidora
EVENT_BODY: SQL
EVENT_DEFINITION: INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP())
EVENT_TYPE: RECURRING
EXECUTE_AT: NULL
INTERVAL_VALUE: 5
INTERVAL_FIELD: SECOND
SQL_MODE: NULL
STARTS: 0000-00-00 00:00:00
ENDS: 0000-00-00 00:00:00
STATUS: ENABLED
ON_COMPLETION: NOT PRESERVE
CREATED: 2006-02-09 22:36:06
LAST_ALTERED: 2006-02-09 22:36:06
LAST_EXECUTED: NULL
EVENT_COMMENT:
1 row in set (0.00 sec)若要撤銷 EVENT 權限,請使用 REVOKE 陳述式。在此範例中,綱要 myschema 上的 EVENT 權限會從 jon@ghidora 使用者帳戶中移除
REVOKE EVENT ON myschema.* FROM jon@ghidora;
假設使用者 jon@ghidora 已獲授 myschema 綱要上的 EVENT 和 INSERT 權限。然後,此使用者建立下列事件
CREATE EVENT e_insert
ON SCHEDULE
EVERY 7 SECOND
DO
INSERT INTO myschema.mytable;在建立此事件後,root 撤銷 jon@ghidora 的 EVENT 權限。但是,e_insert 會繼續執行,每七秒在 mytable 中插入一個新的資料列。如果 root 發出下列任一陳述式,情況也會相同
DROP USER jon@ghidora;RENAME USER jon@ghidora TO someotherguy@ghidora;
您可以在發出 DROP USER 或 RENAME USER 陳述式之前和之後檢查 Information Schema EVENTS 表格,以驗證此情況是否屬實。
事件定義儲存在資料字典中。若要捨棄由其他使用者帳戶建立的事件,您必須是 MySQL root 使用者或其他具有必要權限的使用者。
使用者的 EVENT 權限儲存在 mysql.user 和 mysql.db 表格的 Event_priv 欄中。在這兩種情況下,此欄都會保存值 'Y' 或 'N'。 'N' 為預設值。只有在使用者具有全域 EVENT 權限(亦即,如果使用 GRANT EVENT ON *.* 授予權限)時,才會將 mysql.user.Event_priv 設定為 'Y'。對於綱要層級的 EVENT 權限,GRANT 會在 mysql.db 中建立一個資料列,並將該資料列的 Db 欄設定為綱要名稱,User 欄設定為使用者名稱,而 Event_priv 欄設定為 'Y'。由於 GRANT EVENT 和 REVOKE EVENT 陳述式會在這些表格上執行必要的操作,因此絕不需要直接操作這些表格。
五個狀態變數提供與事件相關的操作計數(但不包括事件執行的陳述式;請參閱 第 27.8 節「儲存程式的限制」)。這些變數為
Com_create_event:自上次伺服器重新啟動以來執行的CREATE EVENT陳述式數量。Com_alter_event:自上次伺服器重新啟動以來執行的ALTER EVENT陳述式數量。Com_drop_event:自上次伺服器重新啟動以來執行的DROP EVENT陳述式數量。Com_show_create_event:自上次伺服器重新啟動以來執行的SHOW CREATE EVENT陳述式數量。Com_show_events:自上次伺服器重新啟動以來執行的SHOW EVENTS陳述式數量。
您可以透過執行語法 SHOW STATUS LIKE '%event%'; 來一次檢視所有這些的目前值。