2010년 12월 28일 화요일

트리거(Trigger)와 이벤트(Event)의 생성 및 실행 권한



이번에는 Trigger Event의 권한 설정에 대해서 알아보도록 하겠다.
MySQL 5.0 버전에서는 Trigger를 위한 권한이 조금 부족한 상황이다.
그래서 MySQL 5.0에서는 일반 사용자가 Trigger를 생성 및 호출하기 위해서는 ROOT 유저 (그 외, SUPER 권한을 가진 사용자)의 도움이 필요하다.

-- // 트리거 (Trigger) 생성 문장
CREATE
    DEFINER = { user | CURRENT_USER } 
    TRIGGER backup_record AFTER UPDATE
    ON member FOR EACH ROW
BEGIN
  ...
  ...
END;

위의 기본 Trigger의 구조에서 보이는 것처럼 Trigger SQL SECURITY를 명시하는 구문이 없다
Trigger Event는 특정 이벤트가 발생하면 자동으로 실행되기 때문에 INVOKER라는 개념이 있을 수 없다
또한 내부적으로 Trigger Event SQL SECURITYDEFINER인 방식으로 처리된다. 또한 MySQL 5.0에서는 Trigger를 위한 권한 (Privileges)가 없기 때문에 Trigger를 실행하기 위해서는 SUPER 권한(Privileges)을 반드시 가지고 있어야 한다.

그래서, 서비스용으로 Trigger를 사용하고자 하는 경우에는 반드시 아래 두 가지 중에서 한 방법을 사용해야 한다.
l  서비스용 MySQL 계정이 SUPER 권한을 가지고 있거나
l  Trigger DBA (ROOT 또는 SUPER 권한을 가지고 있는 계정)계정으로 생성하고, DEFINER를 자기 자신으로 설정하는 방법

이 두 가지 방법의 차이는
첫 번째 방법은 Trigger를 서비스 계정의 컨텍스트 (Context)로 실행하게 되며,
두 번째 방법은 Trigger DEFINER로 명시된 DBA 계정의 권한 컨텍스트(Context)로 실행하게 된다.
일반적으로 서비스용 계정에 SUPER 권한(Privileges)를 부여하는 것은 조금 위험할 수 있으므로 두 번째 방법이 적합할 것으로 생각된다.

MySQL 5.1 이상부터는 TRIGGER라는 권한 (Privileges)가 새로이 도입되어서, Trigger의 생성 및 호출을 SUPER 권한과 분리해서 부여할 수 있게 되었다.
또한 MySQL 5.1 부터는 EVENT라는 권한(Privileges)가 새로이 도입되어서, Event의 생성 및 호출 권한을 서비스용 계정에 SUPER 권한 없이 부여할 수 있게 되었다. (Event라는 기능이 MySQL 5.1부터 추가되었으므로 Event에 대한 권한 문제는 고려하지 않아도 된다)

댓글 없음:

댓글 쓰기