Loading...
MySQL 9.5 Reference Manual 9.5의 15.1.26 CREATE TRIGGER Statement의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
1CREATE 2 [DEFINER = user] 3 TRIGGER [IF NOT EXISTS] trigger_name 4 trigger_time trigger_event 5 ON tbl_name FOR EACH ROW 6 [trigger_order] 7 trigger_body 8 9trigger_time: { BEFORE | AFTER } 10 11trigger_event: { INSERT | UPDATE | DELETE } 12 13trigger_order: { FOLLOWS | PRECEDES } other_trigger_name
이 문장은 새로운 트리거를 생성합니다. 트리거는 테이블에 연결된 이름 있는 데이터베이스 오브젝트이며, 해당 테이블에 대해 특정 이벤트가 발생할 때 활성화됩니다. 트리거는 _tbl_name_이라는 이름의 테이블과 연결되며, 이는 영구 테이블을 가리켜야 합니다. 트리거를 TEMPORARY 테이블이나 뷰에 연결할 수는 없습니다.
트리거 이름은 스키마 네임스페이스 내에 존재하므로, 하나의 스키마 내에서는 모든 트리거의 이름이 고유해야 합니다. 서로 다른 스키마에 있는 트리거들은 동일한 이름을 가질 수 있습니다.
IF NOT EXISTS는 동일한 스키마 내에서 같은 이름을 갖고, 같은 테이블에 대해 존재하는 트리거가 있을 경우 오류가 발생하는 것을 방지합니다.
이 섹션에서는 CREATE TRIGGER 구문을 설명합니다. 추가적인 논의는 Section 27.4.1, “Trigger Syntax and Examples”를 참조하십시오.
CREATE TRIGGER를 사용하려면, 트리거가 연결된 테이블에 대해 TRIGGER 권한이 필요합니다. DEFINER 절이 존재하는 경우, 필요한 권한은 Section 27.8, “Stored Object Access Control”에서 설명하는 대로 user 값에 따라 달라집니다. 바이너리 로깅이 활성화되어 있다면, CREATE TRIGGER는 Section 27.9, “Stored Program Binary Logging”에서 설명하는 대로 SUPER 권한을 필요로 할 수 있습니다.
DEFINER 절은 나중에 이 섹션에서 설명하는 대로, 트리거 활성화 시점에 접근 권한을 검사할 때 사용되는 보안 컨텍스트를 결정합니다.
_trigger_time_은 트리거 액션 타임입니다. 해당 트리거가 변경될 각 로우에 대해, 트리거가 그 전에 활성화될지 이후에 활성화될지를 나타내기 위해 BEFORE 또는 AFTER가 될 수 있습니다.
기본적인 컬럼 값 검사는 트리거 활성화 이전에 수행되므로, 컬럼 타입에 부적절한 값을 유효한 값으로 변환하기 위해 BEFORE 트리거를 사용할 수는 없습니다.
_trigger_event_는 트리거를 활성화하는 작업의 종류를 나타냅니다. 다음과 같은 trigger_event 값들이 허용됩니다:
INSERT: 새로운 로우가 테이블에 삽입될 때마다 트리거가 활성화됩니다(예: INSERT,
LOAD DATA,
REPLACE 문을 통해).
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 트리거 둘 다가 이어서 활성화됩니다.
참고
Cascaded 외래 키 액션은 트리거를 활성화하지 않습니다.
하나의 테이블에 대해 동일한 트리거 이벤트와 액션 타임을 갖는 여러 개의 트리거를 정의하는 것이 가능합니다. 예를 들어, 하나의 테이블에 대해 두 개의 BEFORE UPDATE 트리거를 가질 수 있습니다. 기본적으로, 동일한 트리거 이벤트와 액션 타임을 갖는 트리거들은 생성된 순서대로 활성화됩니다.
트리거 순서에 영향을 주기 위해서는, FOLLOWS 또는 PRECEDES와, 동일한 트리거 이벤트 및 액션 타임을 갖는 기존 트리거의 이름을 나타내는 trigger_order 절을 지정하십시오. FOLLOWS를 사용하면 새로운 트리거는 기존 트리거 뒤에 활성화됩니다. PRECEDES를 사용하면 새로운 트리거는 기존 트리거 앞에 활성화됩니다.
_trigger_body_는 트리거가 활성화될 때 실행할 문장입니다. 여러 문장을 실행하려면 BEGIN ... END 복합 문장 구문을 사용합니다. 이를 사용하면 스토어드 루틴 내에서 허용되는 것과 동일한 문장들을 사용할 수 있습니다. Section 15.6.1, “BEGIN ... END Compound Statement”를 참조하십시오.
또한 일부 문장은 트리거에서 허용되지 않습니다. 이에 대해서는 Section 27.10, “Restrictions on Stored Programs”를 참조하십시오.
트리거 바디 안에서, 서브젝트 테이블(트리거가 연결된 테이블)의 컬럼은 OLD와 NEW 별칭을 사용하여 참조할 수 있습니다.
OLD.col_name은 업데이트 또는 삭제되기 이전의 기존 로우의 컬럼을 가리킵니다.
NEW.col_name은 삽입될 새로운 로우의 컬럼 또는 업데이트된 이후의 기존 로우의 컬럼을 가리킵니다.
트리거에서는 생성 칼럼을 참조하기 위해 NEW.col_name을 사용하거나 OLD.col_name을 사용할 수 없습니다. 생성 칼럼에 대한 정보는 Section 15.1.24.8, “CREATE TABLE and Generated Columns”를 참조하십시오.
MySQL은 트리거가 생성될 때의 sql_mode 시스템 변수 값을 저장하며, 트리거가 실행을 시작하는 시점의 현재 서버 SQL 모드와 관계없이, 항상 이 설정을 적용하여 트리거 바디를 실행합니다.
DEFINER 절은 트리거 활성화 시점에 접근 권한을 검사할 때 사용되는 MySQL 계정을 지정합니다. DEFINER 절이 존재하는 경우, user 값은 'user_name'@'host_name', CURRENT_USER, 또는 CURRENT_USER()와 같이 MySQL 계정으로 지정되어야 합니다. 허용되는 user 값은 Section 27.8, “Stored Object Access Control”에서 설명하는 대로, 사용자가 보유한 권한에 따라 달라집니다. 트리거 보안에 대한 추가 정보도 해당 섹션을 참조하십시오.
DEFINER 절이 생략되면, 기본 디파이너는 CREATE TRIGGER 문을 실행하는 사용자입니다. 이는 DEFINER = CURRENT_USER를 명시적으로 지정한 것과 동일합니다.
MySQL은 트리거 권한을 검사할 때 다음과 같이 DEFINER 사용자를 고려합니다:
CREATE TRIGGER 시점에는, 문을 실행하는 사용자가 TRIGGER 권한을 가지고 있어야 합니다.
트리거 활성화 시점에는, 권한은 DEFINER 사용자에 대해 검사됩니다. 이 사용자는 다음 권한을 가져야 합니다:
트리거 바디 안에서 CURRENT_USER 함수는 트리거 활성화 시점에 권한을 검사하는 데 사용되는 계정을 반환합니다. 이는 트리거를 활성화하게 만든 사용자가 아니라 DEFINER 사용자입니다. 트리거 내에서의 사용자 감사(auditing)에 대한 정보는 Section 8.2.23, “SQL-Based Account Activity Auditing”를 참조하십시오.
LOCK TABLES를 사용하여 트리거가 존재하는 테이블을 잠그는 경우, LOCK TABLES and Triggers에 설명된 대로 트리거에서 사용되는 테이블 역시 잠깁니다.
트리거 사용에 대한 추가적인 논의는 Section 27.4.1, “Trigger Syntax and Examples”를 참조하십시오.
15.1.25 CREATE TABLESPACE Statement
15.1.27 CREATE VIEW Statement