Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

25.4.6 イベントスケジューラと MySQL 権限

スケジュール設定済みイベントの実行を有効または無効にするには、event_scheduler グローバルシステム変数の値を設定する必要があります。 これには、グローバルシステム変数を設定するのに十分な権限が必要です。 セクション5.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@ghidoramyschema に対する EVENT 権限を保有しているとします。 また、このユーザーは myschema に対する SELECT 権限は保有しているが、このスキーマに対するほかの権限は保有していないとします。 jon@ghidora は、次のような新しいイベントを作成できます。

CREATE EVENT e_store_ts
    ON SCHEDULE
      EVERY 10 SECOND
    DO
      INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP());

このユーザーは 1 分ほど待機したあと、テーブルに複数の新しい行が表示されることを予想して 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 スキーマに対する EVENT および INSERT 権限が与えられているとします。 続いてこのユーザーが次のイベントを作成します。

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

このイベントの作成後、rootjon@ghidoraEVENT 権限を取り消します。 ただし、e_insert は実行し続け、7 秒ごとに新しい行が mytable に挿入されます。 root が次のどちらかのステートメントを発行した場合も、同じことが当てはまります。

  • DROP USER jon@ghidora;

  • RENAME USER jon@ghidora TO someotherguy@ghidora;

これが正しいことを確認するには、DROP USER または RENAME USER ステートメントの発行前後に INFORMATION_SCHEMA.EVENTS テーブル (セクション26.14「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 ステートメントがこれらのテーブルでの必要な操作を実行するので、これらのテーブルを直接操作する必要はありません。

5 つのステータス変数が、イベント関連操作のカウントを提供します (ただし、イベントが実行するステートメントのカウントは提供しませんセクション25.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%'; を実行すると、これらのすべての現在値を一度に表示できます。