MySQL에서 사용자의 모든 권한(GRANT) 확인하기
MySQL에서 특정 사용자에게 부여된 모든 권한을 한눈에 확인하고 싶다면 INFORMATION_SCHEMA.SCHEMA_PRIVILEGES 테이블을 조회하면 됩니다. 이 테이블에는 데이터베이스(스키마) 수준에서 각 계정에 부여된 권한 정보가 기록되어 있어, 권한 감사나 사용자 관리 작업에 매우 유용합니다.
기본 조회 문법
아래 쿼리를 실행하면 시스템에 등록된 모든 스키마 권한 목록을 확인할 수 있습니다.
SELECT * FROM INFORMATION_SCHEMA.SCHEMA_PRIVILEGES;
실행 예제
실제로 위 쿼리를 MySQL에서 실행해 보겠습니다.
mysql> SELECT * FROM INFORMATION_SCHEMA.SCHEMA_PRIVILEGES;
이 쿼리는 다음과 같은 결과를 반환합니다.
+-----------------------------+---------------+--------------------+-------------------------+--------------+ | GRANTEE | TABLE_CATALOG | TABLE_SCHEMA | PRIVILEGE_TYPE | IS_GRANTABLE | +-----------------------------+---------------+--------------------+-------------------------+--------------+ | 'mysql.sys'@'localhost' | def | sys | TRIGGER | NO | | 'Adam Smith'@'localhost' | def | test | SELECT | NO | | 'Adam Smith'@'localhost' | def | test | INSERT | NO | | 'Adam Smith'@'localhost' | def | test | UPDATE | NO | | 'Adam Smith'@'localhost' | def | test | DELETE | NO | | 'Adam Smith'@'localhost' | def | test | CREATE | NO | | 'Adam Smith'@'localhost' | def | test | DROP | NO | | 'Adam Smith'@'localhost' | def | test | REFERENCES | NO | | 'Adam Smith'@'localhost' | def | test | INDEX | NO | | 'Adam Smith'@'localhost' | def | test | ALTER | NO | | 'Adam Smith'@'localhost' | def | test | CREATE TEMPORARY TABLES | NO | | 'Adam Smith'@'localhost' | def | test | LOCK TABLES | NO | | 'Adam Smith'@'localhost' | def | test | EXECUTE | NO | | 'Adam Smith'@'localhost' | def | test | CREATE VIEW | NO | | 'Adam Smith'@'localhost' | def | test | SHOW VIEW | NO | | 'Adam Smith'@'localhost' | def | test | CREATE ROUTINE | NO | | 'Adam Smith'@'localhost' | def | test | ALTER ROUTINE | NO | | 'Adam Smith'@'localhost' | def | test | EVENT | NO | | 'Adam Smith'@'localhost' | def | test | TRIGGER | NO | | 'David'@'localhost' | def | test | SELECT | NO | | 'David'@'localhost' | def | test | INSERT | NO | | 'David'@'localhost' | def | test | UPDATE | NO | | 'David'@'localhost' | def | test | DELETE | NO | | 'David'@'localhost' | def | test | CREATE | NO | | 'David'@'localhost' | def | test | REFERENCES | NO | | 'David'@'localhost' | def | test | ALTER | NO | | 'mysql.session'@'localhost' | def | performance_schema | SELECT | NO | | 'Robert'@'%' | def | sample | SELECT | YES | | 'Robert'@'%' | def | sample | INSERT | YES | | 'Robert'@'%' | def | sample | UPDATE | YES | | 'Robert'@'%' | def | sample | DELETE | YES | | 'Robert'@'%' | def | sample | CREATE | YES | | 'Robert'@'%' | def | sample | DROP | YES | | 'Robert'@'%' | def | sample | REFERENCES | YES | | 'Robert'@'%' | def | sample | INDEX | YES | | 'Robert'@'%' | def | sample | ALTER | YES | | 'Robert'@'%' | def | sample | CREATE TEMPORARY TABLES | YES | | 'Robert'@'%' | def | sample | LOCK TABLES | YES | | 'Robert'@'%' | def | sample | EXECUTE | YES | | 'Robert'@'%' | def | sample | CREATE VIEW | YES | | 'Robert'@'%' | def | sample | SHOW VIEW | YES | | 'Robert'@'%' | def | sample | CREATE ROUTINE | YES | | 'Robert'@'%' | def | sample | ALTER ROUTINE | YES | | 'Robert'@'%' | def | sample | EVENT | YES | | 'Robert'@'%' | def | sample | TRIGGER | YES | | 'Robert'@'%' | def | web | EXECUTE | NO | +-----------------------------+---------------+--------------------+-------------------------+--------------+ 46 rows in set (0.00 sec)
출력 결과를 살펴보면 'Adam Smith'@'localhost' 계정은 test 데이터베이스에 대해 SELECT, INSERT, UPDATE, DELETE 등 다양한 권한을 부여받았습니다. 반면 'Robert'@'%' 계정은 sample 데이터베이스에 대한 권한 외에 IS_GRANTABLE 값이 YES로 표시되어 있는데, 이는 해당 권한을 다른 사용자에게 재부여(GRANT OPTION)할 수 있음을 의미합니다.
주요 컬럼 설명
- GRANTEE: 권한이 부여된 계정으로, '사용자명'@'호스트' 형식으로 표시됩니다.
- TABLE_CATALOG: 카탈로그 이름으로, 항상 def 값이 저장됩니다.
- TABLE_SCHEMA: 권한이 적용되는 스키마(데이터베이스)의 이름입니다.
- PRIVILEGE_TYPE: 부여된 권한의 종류(SELECT, INSERT, UPDATE, DELETE 등)입니다.
- IS_GRANTABLE: 해당 권한을 다른 사용자에게 다시 부여할 수 있는지 여부(NO 또는 YES)입니다.
특정 사용자의 권한만 조회하기
전체 목록이 아닌 특정 사용자의 권한만 확인하려면 WHERE 절을 활용하면 됩니다.
SELECT * FROM INFORMATION_SCHEMA.SCHEMA_PRIVILEGES WHERE GRANTEE = "'Robert'@'% '";
SHOW GRANTS 문 활용하기
INFORMATION_SCHEMA 조회 외에도 SHOW GRANTS 문을 사용하면 특정 계정에 부여된 권한을 GRANT 문 형태로 더 간편하게 확인할 수 있습니다.
SHOW GRANTS FOR 'Robert'@'%';
두 방법을 상황에 맞게 활용하면 MySQL 사용자 권한을 체계적으로 관리하고 보안 점검을 수행하는 데 큰 도움이 됩니다.