Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 저장 프로시저에서 DEFINER=`root`@`%`가 localhost에서 작동하지 않는 이유와 해결 방법

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 환경에서도 저장 프로시저를 안정적으로 운영할 수 있습니다.