본문 바로가기
MySQL별책부록

Stored Routine 안에서 파라메터 이용하여 DCL /DDL 문장 실행하기

by 모모레 2020. 6. 13.

개인적인 업무 자동화 처리를 위해 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 구문은 안해봤지만......할 수 있지 않을까 한다. ㅋ