Loading...
MySQL 9.5 Reference Manual 9.5의 27.5.6 The Event Scheduler and MySQL Privileges의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
예약된 event의 실행을 활성화하거나 비활성화하려면 global event_scheduler 시스템 변수의 값을 설정해야 합니다.
이를 위해서는 global 시스템 변수를 설정할 수 있을 만큼의 권한이 필요합니다.
Section 7.1.9.1, “System Variable Privileges”를 참조하십시오.
EVENT 권한은 event의 생성, 수정, 삭제를 제어합니다.
이 권한은 GRANT를 사용하여 부여할 수 있습니다.
예를 들어, 다음 GRANT 문장은
myschema라는 스키마에 대해
jon@ghidora 사용자에게
EVENT 권한을 부여합니다:
1GRANT EVENT ON myschema.* TO jon@ghidora;
(이 사용자 계정이 이미 존재하며, 그 외의 다른 점은 변경하지 않기를 원한다고 가정합니다.)
같은 사용자에게 모든 스키마에 대한
EVENT 권한을 부여하려면 다음 문장을 사용합니다:
1GRANT EVENT ON *.* TO jon@ghidora;
EVENT 권한은 global 또는 스키마 수준의 스코프를 가집니다.
따라서 단일 테이블에 대해 이를 부여하려고 하면 다음과 같이 에러가 발생합니다:
1mysql> GRANT EVENT ON myschema.mytable TO jon@ghidora; 2ERROR 1144 (42000): Illegal GRANT/REVOKE command; please 3consult the manual to see which privileges can be used
event는 그 definer의 권한으로 실행되며, definer가 필요한 권한을 가지고 있지 않은 작업은 수행할 수 없다는 점을 이해하는 것이 중요합니다.
예를 들어, jon@ghidora가
myschema에 대해
EVENT 권한을 가지고 있다고 가정합니다.
또한 이 사용자가 myschema에 대해
SELECT 권한만 가지고 있고,
이 스키마에 대해 다른 권한은 없다고 가정합니다.
이 경우 jon@ghidora는 다음과 같은 새로운 event를 생성할 수 있습니다:
1CREATE EVENT e_store_ts 2 ON SCHEDULE 3 EVERY 10 SECOND 4 DO 5 INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP());
사용자는 약 1분 정도 기다린 다음, 테이블에 여러 개의 새로운 행이 보일 것으로 기대하며
SELECT * FROM mytable; 쿼리를 수행합니다.
그러나 테이블은 비어 있습니다.
해당 테이블에 대해 사용자가
INSERT 권한을 가지고 있지 않기 때문에,
event는 아무런 효과도 갖지 못합니다.
MySQL 에러 로그
(hostname.err)를 살펴보면,
event는 실행되고 있지만, 시도하는 작업이 실패하고 있음을 알 수 있습니다:
12013-09-24T12:41:31.261992Z 25 [ERROR] Event Scheduler: 2[jon@ghidora][cookbook.e_store_ts] INSERT command denied to user 3'jon'@'ghidora' for table 'mytable' 42013-09-24T12:41:31.262022Z 25 [Note] Event Scheduler: 5[jon@ghidora].[myschema.e_store_ts] event execution failed. 62013-09-24T12:41:41.271796Z 26 [ERROR] Event Scheduler: 7[jon@ghidora][cookbook.e_store_ts] INSERT command denied to user 8'jon'@'ghidora' for table 'mytable' 92013-09-24T12:41:41.272761Z 26 [Note] Event Scheduler: 10[jon@ghidora].[myschema.e_store_ts] event execution failed.
이 사용자는 에러 로그에 접근할 수 없을 가능성이 매우 크므로, event의 action 문장이 유효한지 여부는 이를 직접 실행해 봄으로써 검증할 수 있습니다:
1mysql> INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP()); 2ERROR 1142 (42000): INSERT command denied to user 3'jon'@'ghidora' for table 'mytable'
Information Schema의
EVENTS 테이블을 검사해 보면
e_store_ts가 존재하고 enabled 상태이지만,
그 LAST_EXECUTED 컬럼이
NULL임을 알 수 있습니다:
1mysql> SELECT * FROM INFORMATION_SCHEMA.EVENTS 2 > WHERE EVENT_NAME='e_store_ts' 3 > AND EVENT_SCHEMA='myschema'\G 4*************************** 1. row *************************** 5 EVENT_CATALOG: NULL 6 EVENT_SCHEMA: myschema 7 EVENT_NAME: e_store_ts 8 DEFINER: jon@ghidora 9 EVENT_BODY: SQL 10EVENT_DEFINITION: INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP()) 11 EVENT_TYPE: RECURRING 12 EXECUTE_AT: NULL 13 INTERVAL_VALUE: 5 14 INTERVAL_FIELD: SECOND 15 SQL_MODE: NULL 16 STARTS: 0000-00-00 00:00:00 17 ENDS: 0000-00-00 00:00:00 18 STATUS: ENABLED 19 ON_COMPLETION: NOT PRESERVE 20 CREATED: 2006-02-09 22:36:06 21 LAST_ALTERED: 2006-02-09 22:36:06 22 LAST_EXECUTED: NULL 23 EVENT_COMMENT: 241 row in set (0.00 sec)
EVENT 권한을 철회(revoke)하려면
REVOKE 문장을 사용합니다.
이 예에서는 myschema 스키마에 대한
EVENT 권한이
jon@ghidora 사용자 계정에서 제거됩니다:
1REVOKE EVENT ON myschema.* FROM jon@ghidora;
주의
사용자로부터 EVENT 권한을 철회하더라도,
그 사용자가 생성했을 수 있는 event는 삭제되거나 비활성화되지 않습니다.
event는 이를 생성한 사용자를 rename하거나 drop하더라도 마이그레이션되거나 drop되지 않습니다.
사용자 jon@ghidora가
myschema 스키마에 대해
EVENT 권한과
INSERT 권한을 부여받았다고 가정합니다.
이 사용자는 다음 event를 생성합니다:
1CREATE EVENT e_insert 2 ON SCHEDULE 3 EVERY 7 SECOND 4 DO 5 INSERT INTO myschema.mytable;
이 event가 생성된 후, 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 테이블을 살펴보면
이 사실을 확인할 수 있습니다.
event 정의는 데이터 딕셔너리에 저장됩니다.
다른 사용자 계정이 생성한 event를 drop하려면
MySQL root 사용자이거나, 필요한 권한을 가진 다른 사용자여야 합니다.
사용자의 EVENT 권한은
mysql.user와 mysql.db 테이블의
Event_priv 컬럼에 저장됩니다.
두 경우 모두 이 컬럼은 'Y' 또는 'N' 중 하나의 값을 가집니다.
기본값은 'N'입니다.
mysql.user.Event_priv는 특정 사용자에게
global EVENT 권한이 부여된 경우에만
(즉, GRANT EVENT ON *.*을 사용해 권한이 부여된 경우에만)
그 사용자에 대해 'Y'로 설정됩니다.
스키마 수준의
EVENT 권한의 경우,
GRANT는
mysql.db에 행을 생성하고,
해당 행의 Db 컬럼을 스키마 이름으로,
User 컬럼을 사용자 이름으로,
Event_priv 컬럼을 'Y'로 설정합니다.
GRANT EVENT와 REVOKE EVENT 문장이
이들 테이블에 필요한 작업을 수행하므로,
이 테이블을 직접 조작해야 할 필요는 전혀 없어야 합니다.
다섯 개의 status 변수는 event 관련 작업의 횟수를 제공합니다 (하지만 event에 의해 실행된 문장의 수는 제공하지 않습니다; Section 27.10, “Restrictions on Stored Programs”를 참조하십시오). 이들은 다음과 같습니다:
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%'; 문장을 실행하면
이 모든 값의 현재 값을 한 번에 확인할 수 있습니다.
27.5.5 Event Scheduler Status
27.6 Using Views