若要啟用或停用排程事件的執行,需要設定全域 event_scheduler
系統變數的值。這需要足夠的權限來設定全域系統變數。請參閱第 7.1.9.1 節,「系統變數權限」。
EVENT
權限管理事件的建立、修改和刪除。此權限可以使用 GRANT
授予。例如,此 GRANT
陳述式將 jon@ghidora
使用者在名為 myschema
的 schema 上授予 EVENT
權限
GRANT EVENT ON myschema.* TO jon@ghidora;
(我們假設此使用者帳戶已存在,且我們希望其保持不變。)
若要將相同的 EVENT
權限授予給所有 schema 的使用者,請使用以下陳述式
GRANT EVENT ON *.* TO jon@ghidora;
EVENT
權限具有全域或 schema 層級的範圍。因此,嘗試在單一表格上授予它會導致錯誤,如下所示
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
權限,但對於此 schema 沒有其他權限。 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
陳述式。在此範例中,將 jon@ghidora
使用者帳戶在 myschema
schema 上的 EVENT
權限移除
REVOKE EVENT ON myschema.* FROM jon@ghidora;
假設使用者 jon@ghidora
已被授予 myschema
schema 的 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.9 節,〈儲存程式的限制〉)。這些變數如下:
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%';
,一次檢視所有這些變數的目前值。