20.4.6 Event Scheduler와 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@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
.errRetCode=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;
이 이벤트를 만든 후 root
는 jon@ghidora
의 EVENT
권한을 취소합니다. 그러나 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%';
를 실행하면 이러한 모든 현재 값을 한 번에 볼 수 있습니다.