13.1.19 CREATE TRIGGER 구문
CREATE [DEFINER = {user
| CURRENT_USER }] TRIGGERtrigger_name
trigger_time
trigger_event
ONtbl_name
FOR EACH ROWtrigger_body
trigger_time
: { BEFORE | AFTER }trigger_event
: { INSERT | UPDATE | DELETE }
이 문은 새로운 트리거를 만듭니다. 트리거는 테이블과 관련된 해당 테이블에 대해 특정 이벤트가 발생하면 활성화되는 명명 된 데이터베이스 오브젝트입니다. 트리거는 tbl_name
라는 테이블에 연결됩니다. 이것은 영구 테이블을 가리켜 야합니다. 트리거를 TEMPORARY
테이블 또는 뷰에 연결할 수 없습니다.
트리거 이름은 스키마의 네임 스페이스에 존재합니다. 즉, 모든 트리거가 스키마에서 고유 한 이름을 가져야합니다. 다른 스키마의 트리거는 같은 이름을 가질 수 있습니다.
이 섹션에서는 CREATE TRIGGER
구문에 대해 설명합니다. 자세한 내용은 섹션 20.3.1 "트리거 구문 및 예" 를 참조하십시오.
CREATE TRIGGER
이 트리거에 연결된 테이블의 TRIGGER
권한이 있어야합니다. 이 섹션의 나머지 부분에서 설명 된 바와 같이, DEFINER
값에 따라이 문 SUPER
권한이 필요할 수 있습니다. 바이너리 로깅이 활성화되어있는 경우 섹션 20.7 "저장 프로그램의 바이너리 로깅" 에서 설명 된 바와 같이, CREATE TRIGGER
에 SUPER
권한이 필요할 수 있습니다.
DEFINER
절은이 섹션의 나머지 부분에서 설명 된 바와 같이, 트리거의 활성화 중에 액세스 권한을 확인하는 데 사용되는 보안 컨텍스트를 결정합니다.
trigger_time
이 트리거의 동작 시간입니다. 이것은 트리거가 각 행의 변경 전이나 후에 활성화되는 것을 나타내는 BEFORE
또는 AFTER
할 수 있습니다.
trigger_event
이 트리거를 활성화하는 형식을 나타냅니다. 다음 trigger_event
값이 허용됩니다.
INSERT
:이 트리거 (예를 들어,INSERT
,LOAD DATA
및REPLACE
문을 사용하여) 새로운 행이 테이블에 삽입 될 때마다 활성화됩니다.UPDATE
:이 트리거 (예 :UPDATE
문을 사용하여) 행이 변경 될 때마다 활성화됩니다.DELETE
:이 트리거 (예를 들어,DELETE
및REPLACE
문을 사용하여) 행이 테이블에서 삭제 될 때마다 활성화됩니다. 테이블에 대한DROP TABLE
및TRUNCATE TABLE
문은DELETE
를 사용하지 않기 때문에이 트리거를 활성화하지 않습니다. 또한 파티션을 삭제DELETE
트리거는 활성화되지 않습니다.
trigger_event
는 트리거를 활성화하는 리터럴 SQL 문 유형을 나타내는 것이 아니라 테이블 작업 유형을 나타냅니다. 예를 들어, INSERT
트리거는 INSERT
문뿐만 아니라 LOAD DATA
문에서도 활성화됩니다. 그것은 두 문을 테이블에 행을 삽입하는 것입니다.
이 혼란을 초래할 수있는 예로 INSERT INTO ... ON DUPLICATE KEY UPDATE ...
구문이 있습니다. 모든 행에 BEFORE INSERT
트리거가 활성화 된 후 행에 중복 키가 존재했는지 여부에 따라 AFTER INSERT
트리거 만하거나 BEFORE UPDATE
트리거와 AFTER UPDATE
트리거가 모두 활성화됩니다.
계단식 된 외부 키 액션은 트리거를 활성화하지 않습니다.
특정 테이블에 대한 트리거 이벤트와 액션 시간이 같은 복수의 트리거가 존재해서는 없습니다. 예를 들어, 하나의 테이블에 2 개의 BEFORE UPDATE
트리거를 정의 할 수 없습니다. 그러나 BEFORE UPDATE
및 BEFORE INSERT
트리거 또는 BEFORE UPDATE
와 AFTER UPDATE
트리거는 설정할 수 있습니다.
trigger_body
는 트리거가 활성화 될 때 실행되는 문입니다. 여러 문을 실행하려면 BEGIN ... END
복합 문 구조 구문을 사용합니다. 또한이를 통해 스토어드 루틴 내에서 허용되는 것과 같은 문을 사용할 수 있습니다. 섹션 13.6.1 "BEGIN ... END 복합 문"부분 을 참조하십시오. 일부 문은 트리거 내에서 허용되지 않습니다. 섹션 D.1 "저장 프로그램 제한 사항" 을 참조하십시오.
트리거 본문 내에서는 별칭 OLD
와 NEW
를 사용하여 대상 테이블 (트리거와 관련된 테이블)의 열을 참조 할 수 있습니다. OLD.
업데이트 또는 삭제되기 전에 기존 행의 열을 나타냅니다. col_name
NEW.
는 삽입 된 새 행 또는 업데이트 된 후 기존 행의 열을 나타냅니다. col_name
MySQL은 트리거가 생성되었을 때 유효한 sql_mode
시스템 변수의 설정을 저장하고 트리거가 실행을 시작했을 때 현재의 서버 SQL 모드에 관계없이 항상 트리거 본체를 강제로이 설정 실행합니다.
DEFINER
절은 트리거의 활성화 중에 액세스 권한을 확인하는 데 사용되는 MySQL 계정을 지정합니다. user
값을 지정하려면 '
( user_name
'@' host_name
'GRANT
문에 사용되는 것과 같은 형식), CURRENT_USER
또는 CURRENT_USER()
로 지정된 MySQL 계정에하십시오. DEFINER
의 기본값은 CREATE TRIGGER
문을 실행하는 사용자입니다. 이것은 명시 적으로 DEFINER = CURRENT_USER
를 지정하는 것과 동일합니다.
DEFINER
절을 지정한 경우 다음의 규칙에 따라 유효한 DEFINER
사용자 값이 결정됩니다.
SUPER
권한이없는 경우 허용되는 유일한user
값은 리터럴로 지정하거나CURRENT_USER
를 사용하여 지정한 계정입니다. 정의들을 다른 계정으로 설정할 수 없습니다.SUPER
권한이 있으면 구문으로 유효한 계정 이름을 지정할 수 있습니다. 계정이 실제로 존재하지 않는 경우 경고가 생성됩니다.존재하지 않는
DEFINER
계정에서 트리거를 만들 수 있지만 그 계정이 실제로 존재하게 될 때까지 이러한 트리거를 활성화하는 것은 권장되지 않습니다. 그렇지 권한 확인에 대한 동작은 정의되어 있지 않습니다.
MySQL 트리거 권한을 확인 할 때 DEFINER
사용자를 다음과 같이 고려합니다.
CREATE TRIGGER
시점에서이 문을 실행하는 사용자는TRIGGER
권한이 있어야합니다.트리거 활성화시 권한은
DEFINER
사용자에게 확인됩니다. 이 사용자는 다음의 권한이 필요합니다.대상 테이블에 대한
TRIGGER
권한.테이블 컬럼에 대한 참조가 트리거 본체의
OLD.
또는col_name
NEW.
을 사용하여 발생한 경우 해당 테이블에 대한col_name
SELECT
권한.테이블 컬럼이 트리거 본체의
SET NEW.
할당 대상 일 경우, 대상 테이블에 대한col_name
=value
UPDATE
권한.다른 어떤 권한도 일반적으로 트리거에서 실행되는 명령문 필요합니다.
트리거의 보안 자세한 내용은 섹션 20.6 "저장 프로그램 및 뷰의 액세스 제어" 를 참조하십시오.
트리거 본체에서 CURRENT_USER()
함수는 트리거의 활성화시에 권한을 확인하는 데 사용되는 계정을 반환합니다. 이것은 그 트리거가 활성화되는 원인이되는 작업을 수행 한 사용자가 아닌 DEFINER
사용자입니다. 트리거의 사용자 감사 내용은 섹션 6.3.13 "SQL 기반의 MySQL 계정 활동 감사" 를 참조하십시오.
LOCK TABLES
를 사용하여 트리거가있는 테이블을 잠근 경우 섹션 13.3.5.2 "LOCK TABLES와 트리거" 에 설명 된대로, 트리거에서 사용되는 테이블도 잠겨 있습니다.
트리거 사용의 자세한 내용은 섹션 20.3.1 "트리거 구문 및 예" 를 참조하십시오.