13.1.19 CREATE TRIGGER 구문
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
trigger_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_nameNEW. 는 삽입 된 새 행 또는 업데이트 된 후 기존 행의 열을 나타냅니다. 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_nameNEW.을 사용하여 발생한 경우 해당 테이블에 대한col_nameSELECT권한.테이블 컬럼이 트리거 본체의
SET NEW.할당 대상 일 경우, 대상 테이블에 대한col_name=valueUPDATE권한.다른 어떤 권한도 일반적으로 트리거에서 실행되는 명령문 필요합니다.
트리거의 보안 자세한 내용은 섹션 20.6 "저장 프로그램 및 뷰의 액세스 제어" 를 참조하십시오.
트리거 본체에서 CURRENT_USER() 함수는 트리거의 활성화시에 권한을 확인하는 데 사용되는 계정을 반환합니다. 이것은 그 트리거가 활성화되는 원인이되는 작업을 수행 한 사용자가 아닌 DEFINER 사용자입니다. 트리거의 사용자 감사 내용은 섹션 6.3.13 "SQL 기반의 MySQL 계정 활동 감사" 를 참조하십시오.
LOCK TABLES 를 사용하여 트리거가있는 테이블을 잠근 경우 섹션 13.3.5.2 "LOCK TABLES와 트리거" 에 설명 된대로, 트리거에서 사용되는 테이블도 잠겨 있습니다.
트리거 사용의 자세한 내용은 섹션 20.3.1 "트리거 구문 및 예" 를 참조하십시오.