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

MySQL에서 사용자의 모든 권한(GRANT) 확인하는 방법

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 사용자 권한을 체계적으로 관리하고 보안 점검을 수행하는 데 큰 도움이 됩니다.