13.1.11 CREATE EVENT 구문
CREATE [DEFINER = {user
| CURRENT_USER }] EVENT [IF NOT EXISTS]event_name
ON SCHEDULEschedule
[ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 'comment
'] DOevent_body
;schedule
: ATtimestamp
[+ INTERVALinterval
] ... | EVERYinterval
[STARTStimestamp
[+ INTERVALinterval
] ...] [ENDStimestamp
[+ INTERVALinterval
] ...]interval
:quantity
{YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
이 문은 새로운 이벤트를 만들고 예약합니다. 이 이벤트는 이벤트 스케줄러가 활성화되어 있지 않은 한 실행되지 않습니다. 이벤트 스케줄러의 상태를 확인하고 필요에 따라 그것을 사용하는 방법은 섹션 20.4.2 "이벤트 스케줄러 구성" 을 참조하십시오.
CREATE EVENT
이벤트가 생성 된 스키마에 대한 EVENT
권한이 필요합니다. 이 섹션의 나머지 부분에서 설명 된 바와 같이, DEFINER
값에 따라 SUPER
권한이 필요할 수 있습니다.
유효한 CREATE EVENT
문의 최소 요구 사항은 다음과 같습니다.
키워드
CREATE EVENT
이외에 데이터베이스 스키마의 이벤트를 고유하게 식별하는 이벤트 이름입니다.이벤트가 실행되는시기와 빈도를 결정하는
ON SCHEDULE
절.이벤트에 의해 실행되는 SQL 문을 포함
DO
절.
최소한의 CREATE EVENT
문의 예를 보여줍니다.
CREATE EVENT myevent ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO UPDATE myschema.mytable SET mycol = mycol + 1;
이전 문은 myevent
라는 이벤트를 만듭니다. 이 이벤트는 myschema.mytable
테이블 mycol
컬럼의 값을 1 증가하는 SQL 문을 실행하여 (그 생성의 1 시간 후) 1 회 실행됩니다.
event_name
은 최대 길이가 64 자 유효한 MySQL 식별자 여야합니다. 이벤트 이름은 대소 문자를 구분하지 않기 때문에 myevent
과 MyEvent
라는 두 가지 이벤트를 동일한 스키마에 포함 할 수 없습니다. 일반적으로 이벤트 이름을 관리하는 규칙은 스토어드 루틴의 이름과 동일합니다. 섹션 9.2 "스키마 객체 이름" 을 참조하십시오.
이벤트는 스키마에 연결되어 있습니다. event_name
의 일부로 스키마가 표시되지 않은 경우 기본 (현재) 스키마로 간주됩니다. 이벤트를 특정 스키마에 작성하려면
구문을 사용하여 이벤트 이름을 스키마로 수식합니다. schema_name
. event_name
DEFINER
절은 이벤트 실행시 액세스 권한을 확인하는 데 사용되는 MySQL 계정을 지정합니다. user
값을 지정하려면 '
( user_name
'@' host_name
'GRANT
문에 사용되는 것과 같은 형식), CURRENT_USER
또는 CURRENT_USER()
로 지정된 MySQL 계정에하십시오. DEFINER
의 기본값은 CREATE EVENT
문을 실행하는 사용자입니다. 이것은 명시 적으로 DEFINER = CURRENT_USER
를 지정하는 것과 동일합니다.
DEFINER
절을 지정한 경우 다음의 규칙에 따라 유효한 DEFINER
사용자 값이 결정됩니다.
SUPER
권한이없는 경우 허용되는 유일한user
값은 리터럴로 지정하거나CURRENT_USER
를 사용하여 지정한 계정입니다. 정의들을 다른 계정으로 설정할 수 없습니다.SUPER
권한이 있으면 구문으로 유효한 계정 이름을 지정할 수 있습니다. 계정이 실제로 존재하지 않는 경우 경고가 생성됩니다.존재하지 않는
DEFINER
계정에서 이벤트를 만들 수 있지만 해당 계정이 존재하지 않는 경우 이벤트 실행시 오류가 발생합니다.
이벤트의 보안 자세한 내용은 섹션 20.6 "저장 프로그램 및 뷰의 액세스 제어" 를 참조하십시오.
이벤트 내에서 CURRENT_USER()
함수가 이벤트 실행시 권한을 확인하는 데 사용되는 계정 ( DEFINER
사용자)를 돌려줍니다. 이벤트의 사용자 감사 내용은 섹션 6.3.13 "SQL 기반의 MySQL 계정 활동 감사" 를 참조하십시오.
CREATE EVENT
에서 IF NOT EXISTS
에는 CREATE TABLE
의 경우와 같은 의미가 있습니다. event_name
라는 이벤트가 같은 스키마에 이미 존재하는 경우, 액션은 실행되지 않고 오류도 발생하지 않습니다. (단, 이런 경우는 경고가 생성됩니다.)
ON SCHEDULE
절은 해당 이벤트에 대해 정의 된 event_body
를 반복시기, 빈도 및 기간을 결정합니다. 이 절은 다음의 두 가지 형식 중 하나를 취합니다.
일회성 이벤트에는
AT
가 사용됩니다. 이것은 이벤트가timestamp
timestamp
에 지정된 날짜와 시간에 한 번만 실행되도록 지정합니다. 이 값은 날짜와 시간 모두를 포함한다 또는 datetime 값에 해결되는 식이어야합니다. 이 목적은DATETIME
또는TIMESTAMP
형의 값 중 하나를 사용할 수 있습니다. 날짜가 과거 날짜 인 경우는 다음과 같이 경고가 발생합니다.mysql>
SELECT NOW();
+---------------------+ | NOW() | +---------------------+ | 2006-02-10 23:59:01 | +---------------------+ 1 row in set (0.04 sec) mysql>CREATE EVENT e_totals
->ON SCHEDULE AT '2006-02-10 23:59:00'
->DO INSERT INTO test.totals VALUES (NOW());
Query OK, 0 rows affected, 1 warning (0.00 sec) mysql>SHOW WARNINGS\G
*************************** 1. row *************************** Level: Note Code: 1588 Message: Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation.어떤 이유로 든 그 자체가 잘못된
CREATE EVENT
문은 오류로 실패합니다.현재 날짜와 시간을 지정하려면
CURRENT_TIMESTAMP
를 사용할 수 있습니다. 이런 경우, 이벤트는 생성 되 자마자 작동합니다.현재 날짜와 시간을 기준으로 한 미래의 어떤 시점 ( "지금부터 3 주 후에"라는 문구로 나타나는 시점 등)에 발생하는 이벤트를 만들려면 옵션 어구
+ INTERVAL
을 사용할 수 있습니다 .interval
interval
부분은 수량과 시간 단위의 두 부분으로 구성되어DATE_ADD()
함수에서 사용되는 간격을 관리하는 것과 동일한 구문 규칙을 따릅니다 ( 섹션 12.7 "날짜 및 시간 함수" 를 참조하십시오) . 또한 단위의 키워드도 이벤트를 정의하려면 마이크로 초를 포함한 단위를 사용할 수없는 점을 제외하고 동일합니다. 일부 간격 형에서는 복합의 시간 단위를 사용할 수 있습니다. 예를 들어, "2 분 10 초"는+ INTERVAL '2:10' MINUTE_SECOND
로 나타낼 수 있습니다.또한 간격을 결합 할 수 있습니다. 예를 들어,
AT CURRENT_TIMESTAMP + INTERVAL 3 WEEK + INTERVAL 2 DAY
는 "지금부터 3 주 2 일 후 '와 동일합니다. 이러한 어구의 각 부분은+ INTERVAL
로 시작해야합니다.작업을 주기적으로 반복은
EVERY
절을 사용합니다.EVERY
키워드 뒤에 이전AT
키워드의 설명에 표시된interval
을 지정합니다. (EVERY
는+ INTERVAL
는 사용되지 않습니다.) 예를 들어,EVERY 6 WEEK
은 "6 주마다"를 나타냅니다.EVERY
절에서는+ INTERVAL
절은 허용되지 않지만+ INTERVAL
내에서 허용되는 것과 같은 복합의 시간 단위를 사용할 수 있습니다.EVERY
절에는 옵션STARTS
절을 포함 할 수 있습니다.STARTS
다음에이 작업이 언제 반복을 시작 하는지를 나타내는timestamp
값을 지정합니다. 또한+ INTERVAL
을 사용하여 "지금부터"시간을 지정할 수도 있습니다. 예를 들어,interval
EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + INTERVAL 1 WEEK
는 "지금부터 1 주일 후에 시작하고 3 개월마다"를 나타냅니다. 뿐만 아니라 "지금부터 6 시간 15 분 후부터 시작하여 2 주마다"를EVERY 2 WEEK STARTS CURRENT_TIMESTAMP + INTERVAL '6:15' HOUR_MINUTE
로 나타낼 수 있습니다.STARTS
를 지정하지 않는 것은,STARTS CURRENT_TIMESTAMP
를 사용하는 것과 같습니다. 즉, 이벤트에 지정된 조치는 이벤트가 생성되면 즉시 반복을 시작합니다.EVERY
절에는 옵션ENDS
절을 포함 할 수 있습니다.ENDS
키워드 다음에이 이벤트가 언제 반복을 중지 여부 MySQL에 지시 할timestamp
값을 지정합니다. 또한ENDS
함께+ INTERVAL
을 사용할 수 있습니다. 예를 들어,interval
EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK
는 "지금부터 30 분 후에 시작하고 지금부터 4 주 후에 종료 될 때까지 12 시간마다"와 동일합니다.ENDS
를 사용하지 않는 것은이 이벤트가 언제까지 실행을 계속하는 것을 나타냅니다.ENDS
는 복합 시간 단위에STARTS
과 같은 구문을 지원합니다.EVERY
절에서는STARTS
또는ENDS
또는 둘 모두를 사용할 수 있습니다. 또한 둘 다 사용하지 않을 수도 있습니다.반복 이벤트가 일정 간격 내에 종료하지 않으면 이벤트의 여러 인스턴스가 동시에 실행될 수 있습니다. 이것이 바람직하지 않은 경우는 동시 인스턴스를 방지 할 수있는 메커니즘을 마련하십시오. 예를 들어,
GET_LOCK()
함수와 행 또는 테이블 잠금을 사용할 수 있습니다.
ON SCHEDULE
절에서는 내장 MySQL 함수 및 사용자 변수를 포함하는 식을 사용하여 거기에 포함되어있는 모든 timestamp
또는 interval
값을 얻을 수 있습니다. 이런 식으로 저장 기능과 사용자 정의 함수를 사용하거나 테이블 참조를 사용 할 수 없습니다. 그러나 SELECT FROM DUAL
사용할 수 있습니다. 이것은 CREATE EVENT
문과 ALTER EVENT
문에 모두 적용됩니다. 이러한 경우 저장 기능, 사용자 정의 함수 및 테이블에 대한 참조는 명시 적으로 금지되어 있으며 오류와 함께 실패합니다 (Bug # 22830를 참조하십시오).
ON SCHEDULE
절 시간은 현재 세션 time_zone
값을 사용하여 해석됩니다. 이 이벤트의 시간대, 즉 이벤트를 예약에 사용 된 이벤트가 실행되면 그 이벤트에서 사용되는 시간대입니다. 이러한 시간은 UTC로 변환 된 이벤트의 시간대와 함께 mysql.event
테이블에 저장됩니다. 이렇게하면 서버 시간대 또는 일광의 영향에 대해 발생한 변경 사항과 무관하게 정의 된대로 이벤트의 실행을 처리 할 수 있습니다. 이벤트의 시간 표현 대한 자세한 내용은 섹션 20.4.4 "이벤트 메타 데이터" 를 참조하십시오. 섹션 13.7.5.19 "SHOW EVENTS 구문" 과 섹션 21.7 "INFORMATION_SCHEMA EVENTS 테이블" 을 참조하십시오.
일반적으로 이벤트 기간이 만료되면 이벤트는 즉시 삭제됩니다. 이 동작은 ON COMPLETION PRESERVE
를 지정하여 재정의 할 수 있습니다. ON COMPLETION NOT PRESERVE
를 사용하면 단순히 기본 비 지속성 동작이 명시적인뿐입니다.
DISABLE
키워드를 사용하면 이벤트는 만들 수 있지만 그것이 활성화되지 않도록 할 수 있습니다. 또는 ENABLE
을 사용하여 기본 상태 (활성)을 명시 적으로 할 수 있습니다. 이것은 ALTER EVENT
과 결합하면 가장 효과적입니다 ( 섹션 13.1.2 "ALTER EVENT 구문" 을 참조하십시오).
ENABLE
과 DISABLE
대신 세 번째 값을 사용할 수 있습니다. DISABLE ON SLAVE
이벤트가 마스터에서 만들어진 슬레이브에 복제되었지만 아직 슬레이브에서 실행되지 않았 음을 나타 내기 위해 리플리케이션 슬레이브에서 이벤트의 상태에 대해 설정됩니다. 섹션 17.4.1.11 "호출되는 기능의 복제" 를 참조하십시오.
COMMENT
절을 사용하여 이벤트에 대한 코멘트를 지정할 수 있습니다. comment
는 이벤트 설명에 사용하는 최대 64 문자의 임의의 문자열을 지정할 수 있습니다. 코멘트 텍스트는 문자열 리터럴이기 때문에 따옴표로 묶어야합니다.
DO
절은 이벤트에 의해 실행되는 액션을 지정하는 것이며, SQL 문으로 구성됩니다. 스토어드 루틴에서 사용할 수있는 유효한 MySQL 문의 거의 모든 스케줄 된 이벤트의 액션 문으로도 사용할 수 있습니다. ( 섹션 D.1 "저장 프로그램 제한 사항" 을 참조하십시오.) 예를 들어, 다음 이벤트 e_hourly
는 sessions
테이블의 모든 행을 1 시간에 1 회 삭제합니다. 여기서,이 테이블은 site_activity
스키마의 일부입니다.
CREATE EVENT e_hourly ON SCHEDULE EVERY 1 HOUR COMMENT 'Clears out sessions table each hour.' DO DELETE FROM site_activity.sessions;
MySQL은 이벤트가 생성되거나 변경 될 때 유효한 sql_mode
시스템 변수의 설정을 저장하고 이벤트가 실행을 시작했을 때 현재의 서버 SQL 모드에 관계없이 항상 그 이벤트를 강제로이 설정 에서 실행합니다.
DO
절에 ALTER EVENT
문을 포함하는 CREATE EVENT
문은 성공한 것처럼 보인다. 그러나 결과 예약 된 이벤트를 서버가 실행하려고하면 실행 오류로 실패합니다.
단순히 결과 집합을 반환하는 SELECT
또는 SHOW
등의 문은 이벤트에서 사용되어 아무런 효과도 없습니다. 이러한 진술의 출력은 MySQL 모니터에 전송되지 않고, 또한 어디에도 저장되지 않습니다. 그러나 결과를 포함하는 SELECT ... INTO
와 INSERT INTO ... SELECT
등의 문은 사용할 수 있습니다. (후자의 예는이 섹션에있는 다음 예제를 참조하십시오.)
이벤트가 속하는 스키마는 DO
절에서 테이블 참조에 대한 디폴트 스키마입니다. 다른 스키마의 테이블에 대한 참조는 모두 올바른 스키마 이름으로 규정해야합니다.
다음과 같이 스토어드 루틴과 마찬가지로, BEGIN
및 END
키워드를 사용하여 DO
절에서 복합 명령문의 구문을 사용할 수 있습니다.
delimiter | CREATE EVENT e_daily ON SCHEDULE EVERY 1 DAY COMMENT 'Saves total number of sessions then clears the table each day' DO BEGIN INSERT INTO site_activity.totals (time, total) SELECT CURRENT_TIMESTAMP, COUNT (*) FROM site_activity.sessions; DELETE FROM site_activity.sessions; END | delimiter;
이 예제에서는 delimiter
명령을 사용하여 문 구분자를 변경합니다. 섹션 20.1 "저장 프로그램의 정의" 를 참조하십시오.
이벤트에서는 스토어드 루틴에서 사용되는 같은 더 복잡한 복합 문을 사용할 수 있습니다. 이 예에서는 로컬 변수 오류 처리기 및 흐름 제어 구조 구문을 사용하고 있습니다.
delimiter | CREATE EVENT e ON SCHEDULE EVERY 5 SECOND DO BEGIN DECLARE v INTEGER; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; SET v = 0; WHILE v <5 DO INSERT INTO t1 VALUES (0); UPDATE t2 SET s1 = s1 + 1; SET v = v + 1; END WHILE; END | delimiter;
이벤트 또는 이벤트에서 직접 매개 변수를 전달 방법은 아니지만, 파라미터를 가지는 스토어드 루틴을 이벤트에서 호출 할 수 있습니다.
CREATE EVENT e_call_myproc ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY DO CALL myproc (5, 27);
이벤트의 정의에게 SUPER
권한이 있으면, 그 이벤트는 글로벌 변수의 읽기 및 쓰기가 가능합니다. 이 권한을 부여하면 악용 될 수 있기 때문에 이렇게하면 충분히주의 할 필요가 있습니다.
일반적으로 스토어드 루틴에서 유효한 모든 문을 이벤트에 의해 실행되는 액션 문에 사용할 수 있습니다. 스토어드 루틴 내에서 허용되는 문 자세한 내용은 섹션 20.2.1 "스토어드 루틴 구문" 을 참조하십시오. 스토어드 루틴의 일부로 이벤트를 만들 수 있지만 이벤트를 다른 이벤트로 만들 수 없습니다.