MySQL 저장 프로시저의 DEFINER 문제, 호스트 확인부터 해결까지
MySQL에서 저장 프로시저(Stored Procedure)를 생성하거나 호출할 때 DEFINER=`root`@`%`가 localhost 환경에서 정상적으로 작동하지 않는 경우가 있습니다. 이 문제를 해결하려면 먼저 사용자 계정의 호스트(host) 설정을 확인해야 합니다.
호스트 값은 'localhost' 또는 '%'로 지정될 수 있으며, 각 계정이 어떤 호스트에 연결되어 있는지 아래 쿼리로 확인할 수 있습니다.
1단계: 사용자 계정과 호스트 확인
mysql> select user,host from mysql.user;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+------------------+-----------+ | user | host | +------------------+-----------+ | Bob | % | | User2 | % | | mysql.infoschema | % | | mysql.session | % | | mysql.sys | % | | root | % | | @UserName@ | localhost | | Adam Smith | localhost | | David | localhost | | James | localhost | | John | localhost | | John Doe | localhost | | User1 | localhost | | am | localhost | | hbstudent | localhost | | mysql.infoschema | localhost | | mysql.session | localhost | +------------------+-----------+ 17 rows in set (0.00 sec)
결과를 보면 사용자마다 호스트가 %(모든 호스트 허용) 또는 localhost(로컬 접속만 허용)로 설정되어 있는 것을 알 수 있습니다. 여기서 주의할 점은, DEFINER로 지정된 계정이 실제 존재하지 않거나 호스트가 일치하지 않으면 프로시저 실행 시 권한 오류가 발생한다는 것입니다.
2단계: DEFINER를 지정하여 저장 프로시저 생성
이제 사용자 Bob, 호스트 '%'를 DEFINER로 지정하여 저장 프로시저를 생성해 보겠습니다. 다음은 DEFINER를 포함한 저장 프로시저 생성 쿼리입니다.
mysql> DELIMITER //
mysql> CREATE DEFINER=`Bob`@`%` PROCEDURE `Message`()
BEGIN
select "Hello World";
END
//
Query OK, 0 rows affected (0.14 sec)
mysql> DELIMITER ;DELIMITER //는 프로시저 내부의 세미콜론(;)이 SQL 구문 종료로 해석되지 않도록 구분자를 임시로 변경하는 명령입니다. 프로시저 생성이 완료되면 반드시 DELIMITER ;로 원래 상태로 되돌려야 합니다.
3단계: CALL 명령으로 저장 프로시저 호출
생성된 저장 프로시저는 CALL 명령을 통해 호출할 수 있습니다.
mysql> call `Message`();
실행 결과는 다음과 같습니다.
+-------------+ | Hello World | +-------------+ | Hello World | +-------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
정리 및 핵심 포인트
- DEFINER에 지정하는 계정은
mysql.user테이블에 실제로 존재해야 하며, 사용자명과 호스트가 정확히 일치해야 합니다. `root`@`%`로 지정했는데 localhost에서 오류가 발생한다면, 해당 서버에root@%계정이 없거나 권한이 부족한 경우일 수 있습니다.- 호스트가
%인 계정은 모든 원격 접속을 허용하고,localhost는 로컬 접속만 허용합니다. - 필요하다면
CREATE USER 'root'@'%';후GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';로 계정을 생성·권한 부여하여 문제를 해결할 수 있습니다.
이처럼 DEFINER 관련 오류는 대부분 계정의 존재 여부와 호스트 불일치에서 비롯됩니다. 위 단계를 순서대로 점검하면 localhost 환경에서도 저장 프로시저를 안정적으로 운영할 수 있습니다.