개인적인 업무 자동화 처리를 위해 Stored Routine안에서 DCL 문장 실행이 가능한지 확인해 보고자 했다.
가장 먼저 알고 싶었던 것은 Stored Routine 안에서 DCL 구문을 실행하는게 제약사항에 속하는지 여부였다. 레퍼런스를 뒤져 읽어서 DCL 구문의 실행에 제약사항이 있는지 살펴보았다. 그런데 특별히 노티되는 것을 보지 못했다.
그럼 테스트 해볼 수 있겠구나 판단하고 간단히 테스트 해보기로 한다.
테스트는 MySQL Ver. 8.0.19에서 진행했다.
다음과 같이 Procedure를 생성하여 테스트해 보고자 했다.
delimiter// create procedure test( p1 varchar(20)) begin create database p1; grant select on p1.* to 'root'@'localhost'; end; // delimiter ; |
위와같이 생성하여 컴파일 하고 테스트 했더니....
음냐.....p1으로 입려간 값으로 스키마가 만들어 지고 권한을 주는게 아니라. p1으로 만들어져 버렸다. 이런......
그래서 다음과 같이 해봤다.
drop procedure test; delimiter // create procedure test( p1 varchar(20)) begin set @aa=p1; create database @aa; grant select on @aa.* to 'root'@'localhost'; end; // delimiter ; |
으잉 이것은 컴파일이 안된다.
어떻게 해볼까 고민하다가...server side prepare statement 방식으로 실행해 보기로 했다.
drop procedure test; delimiter // create procedure test( p1 varchar(20)) begin set @cd = CONCAT ("create database ",p1); prepare stmt from @cd; execute stmt; deallocate prepare stmt; set @gd = CONCAT ("grant select on ", p1, ".* to root@localhost"); prepare stmt from @gd; execute stmt; deallocate prepare stmt; end; // delimiter ; |
이렇게 하니 된다~
ㅋㅋ
다른 DCL 구문은 안해봤지만......할 수 있지 않을까 한다. ㅋ
'MySQL별책부록' 카테고리의 다른 글
Collation 에 따른 인덱스 저장 정렬 순서 차이 확인 (0) | 2020.05.07 |
---|---|
binlog format에 따른 query handling & Isolation Level 선택 (0) | 2019.06.06 |
MySQL 내의 process 와 OS 레벨의 process 맵핑 방법 (0) | 2019.04.01 |
InnoDB 컬럼 저장 순서 (0) | 2019.02.15 |
MySQL Ver. 8.0 PERSIST SYSTEM VARIABLE 사용방법 (0) | 2018.11.01 |