현상
JDBC를 통해 MySQL에서 사용 중인 프로시저 정보를 확인하려고 하면 아래와 같은 메시지와 함께 실패하는 경우가 있다.
User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted, configure connection with "noAccessToProcedureBodies=true" to have driver generate parameters that represent INOUT strings irregardless of actual parameter types.
대충 보면 권한 문제처럼 보이는데…… 문제를 해결해보자.
원인
에러 메시지 상에서는 권한 문제라고 하는데, 사용 중인 계정은 이미 특정 데이터베이스에 대한 모든 권한을 갖고 있는 상태이다.
GRANT ALL PRIVILEGES ON `database`.* TO `username`@`10.100.100.1%` WITH GRANT OPTION
확인해 보니 데이터베이스의 권한 문제가 아니라 mysql 메타데이터에 대한 권한 문제로 보인다.
MySQL 데이터베이스는 테이블 컬럼명, 프로시저 등의 메타데이터를 저장하고 있는데, 이러한 메타데이터는 해킹의 목표가 되기 쉽다. 특히 프로시저의 입력 매개변수에 대한 메타데이터는 mysql 데이터베이스의 proc이라는 테이블에 저장되어 있다. 프로시저 호출 시 mysql.proc 테이블에 대한 조회 권한이 필요한데 사용자에게 해당 권한이 없을 때 에러가 발생한다.
사용 중인 계정의 mysql 데이터베이스에 대한 권한을 확인해 봤는데,
GRANT SELECT ON `mysql`.* TO username@`10.100.100.1%`
일단은 SELECT 권한만으로는 안 되는 것 같다.
해결
mysql.proc 테이블에 대한 권한을 수정할 수 없다면 데이터베이스 연결 시 noAccessToProcedureBodies 옵션을 추가하여 문제를 해결할 수 있다.
noAccessToProcedureBodies은 사용자가 mysql.proc에 대한 권한이 없을 때 에러를 발생시키는 대신, 모든 매개변수를 문자열 데이터로 대체한 기본 메타데이터를 생성하게 한다. 해당 옵션은 아래와 같이 지정하면 된다.
jdbc:mysql://example.com/database?noAccessToProcedureBodies=true
noAccessToProcedureBodies 옵션을 활성화하여 데이터베이스에 다시 접속하면, 이제 프로시저에 대한 정보를 확인할 수 있게 된다.
참고 문서
https://blog.naver.com/kkson50/222493851315
https://dev.mysql.com/doc/connector-j/en/connector-j-connp-props-metadata.html