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

スケジュール設定済みイベントの実行を有効または無効にするには、event_scheduler グローバルシステム変数の値を設定する必要があります。これには SUPER 権限が必要です。

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) を調べると、イベントは実行していますが、RetCode=0 で示されているように、イベントが実行しようとしているアクションは失敗していることがわかります。

060209 22:39:44 [Note]     EVEX EXECUTING event newdb.e [EXPR:10]
060209 22:39:44 [Note]     EVEX EXECUTED event newdb.e  [EXPR:10]. RetCode=0
060209 22:39:54 [Note]     EVEX EXECUTING event newdb.e [EXPR:10]
060209 22:39:54 [Note]     EVEX EXECUTED event newdb.e  [EXPR:10]. RetCode=0
060209 22:40:04 [Note]     EVEX EXECUTING event newdb.e [EXPR:10]
060209 22:40:04 [Note]     EVEX EXECUTED event newdb.e  [EXPR:10]. RetCode=0

このユーザーは、エラーログにアクセスできない可能性が非常に高いので、直接それを実行することによって、イベントのアクションステートメントが有効であるかどうか検証できます。

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 ステートメントの発行前後で、mysql.event テーブル (このセクションで後述します) か、INFORMATION_SCHEMA.EVENTS テーブル (セクション21.7「INFORMATION_SCHEMA EVENTS テーブル」を参照してください) を調べると、これが当てはまることを確認できます。

イベント定義は、mysql.event テーブルに格納されています。別のユーザーアカウントが作成したイベントを削除するには、MySQL root ユーザー (または必要な権限を保有する別のユーザー) がこのテーブルから行を削除できます。たとえば、前述のイベント e_insert を削除するには、root は次のステートメントを使用できます。

DELETE FROM mysql.event
    WHERE db = 'myschema'
      AND definer = 'jon@ghidora'
      AND name = 'e_insert';

mysql.event テーブルから行を削除するときには、イベント名、データベーススキーマ名、ユーザーアカウントを一致させることが重要です。これは、同じユーザーが、別々のスキーマに同じ名前の異なるイベントを作成できるためです。

ユーザーの 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 つのステータス変数が、イベント関連操作のカウントを提供します (ただし、イベントが実行するステートメントのカウントは提供しませんセクションD.1「ストアドプログラムの制約」を参照してください)。これらを次に示します。

  • 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%'; を実行すると、これらのすべての現在値を一度に表示できます。


User Comments
Sign Up Login You must be logged in to post a comment.