■ Procedure 및 Function에서 User와 Execute의 관계
▶︎ Execute 권한관련
보통 Function과 Procedure를 생성하면 세션에 접속되어 있는 User에 IP를 이용해서 Definer라는 정보를 생성하게 됩니다.
그런데 이때 조심해야 할 것이 있습니다.
Definer가 EXECUTE권한이 없으면 Procedure나 Function 생성권한이 있더라도 수행이 되지 않습니다. 즉 Create권한만 있으면 자신이 생성했다 하더라도 Procedure나 Function을 수행할 수 없는 것입니다.
▶︎ Definer 및 생성 User 존재 여부
Function이나 Procedure를 만든 User가 반드시 존재해야 합니다.
예를 들어 user1@IP를 가지는 User가 특정 Proc1프로시저를 만들었다고 가정합니다.
이때 user1@IP를 삭제했다면 이 프로시저를 다른 유저가 사용할 수 없습니다.
그 이유는 다음과 같습니다. Procedure 및 Function의 수행 프로세스를 유추해볼때
Proc1에서 user1@IP를 가지는 Definer가 있고 일반 다른 사용자는 Execute권한을 가진다고 가정합니다.
이때 user1@IP를 가진 사용자를 삭제합니다. 그럼 Proc1는 절대로 수행되지 않습니다.
Procedure나 Function을 수행하는 방법은 definer, 즉 user1@IP가 수행하게 되는데 이 User가 삭제되었기 때문에 이 프로시저나 Function을 수행할 수 있는 주체가 사라져버리게 된 것입니다.
즉 user1@IP의 Definer를 가지는 프로시저 Proc1이 있고 이 Procedure를 수행하려는 user2가 있다면 Proc 수행순서는 다음과 같습니다.
user2는 Procedure나 Function을 수행할 수 있는 Execute권한을 가지고 있어야 합니다. user2가 user1@IP를 가지는 Proc1을 수행하게 되면 user!@IP를 통해 Procdure가 수행되게 됩니다. 그래서 Procedure나 Function 수행이 갑자기 되지 않는다면 않는다면 definer@IP 유저가 존재하는지 반식시 한번 확인해 보셔야 합니다.
또한가지 특이한점은 user2@IP가 user1@IP의 프로시저 수행 수행해도 수행 Processlist를 확인해보면 user1@IP로 수행이 되는것을 확인해 볼 수 있습니다. 이 특성을 알아야 Procedure나 Function을 수행할때 에러가 발생되는 원인을 파악하기 쉬울 수 있습니다.
'Databases > MySQL' 카테고리의 다른 글
[MySQL] Routine과 Definer와의 관계 및 모니터링 (0) | 2021.05.24 |
---|---|
[MySQL] auuto_increment_increment와 auto_increment_offset과의 관계 (0) | 2021.05.20 |
[MySQL] lower_case_table_names - 대소문자 구분 파라미터 (0) | 2021.03.29 |
[MySQL] concat, group_concat 사용방법 (0) | 2021.03.29 |
[MySQL] sysdate와 now의 차이점 (0) | 2021.03.28 |