このページは機械翻訳したものです。
スケジュール設定済みイベントの実行を有効または無効にするには、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@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());
このユーザーは 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;
このイベントの作成後、root
は jon@ghidora
の EVENT
権限を取り消します。 ただし、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%';
を実行すると、これらのすべての現在値を一度に表示できます。