若要啟用或停用排程事件的執行,必須設定全域 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%';
來一次檢視所有這些的目前值。