相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  事件排程器與 MySQL 權限

27.4.6 事件排程器與 MySQL 權限

若要啟用或停用排程事件的執行,必須設定全域 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 具有 myschemaEVENT 權限。也假設此使用者具有 myschemaSELECT 權限,但此綱要的其他權限則無。 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;
重要事項

從使用者撤銷 EVENT 權限不會刪除或停用該使用者可能建立的任何事件。

事件不會因為重新命名或刪除建立它的使用者而移轉或捨棄。

假設使用者 jon@ghidora 已獲授 myschema 綱要上的 EVENTINSERT 權限。然後,此使用者建立下列事件

CREATE EVENT e_insert
    ON SCHEDULE
      EVERY 7 SECOND
    DO
      INSERT INTO myschema.mytable;

在建立此事件後,root 撤銷 jon@ghidoraEVENT 權限。但是,e_insert 會繼續執行,每七秒在 mytable 中插入一個新的資料列。如果 root 發出下列任一陳述式,情況也會相同

  • DROP USER jon@ghidora;

  • RENAME USER jon@ghidora TO someotherguy@ghidora;

您可以在發出 DROP USERRENAME USER 陳述式之前和之後檢查 Information Schema EVENTS 表格,以驗證此情況是否屬實。

事件定義儲存在資料字典中。若要捨棄由其他使用者帳戶建立的事件,您必須是 MySQL root 使用者或其他具有必要權限的使用者。

使用者的 EVENT 權限儲存在 mysql.usermysql.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 EVENTREVOKE 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%'; 來一次檢視所有這些的目前值。