✔️

MySQLのユーザー権限について

2024/05/26に公開

データベースの知識がまだまだ少なく、GoのGinでAPIを作っていてMySQLのテーブルになかなかアクセスできなかった話です。

データベースへのアクセス権限確認方法

結論、以下のように.envファイルで定義していたユーザーにテーブルへの権限が一切付与されていなかったのが原因でした。

DB_USER=project_user
DB_PASSWORD=project_pass123
DB_HOST=localhost
DB_NAME=project_database
SECRET_KEY=secretkey

MySQLにrootユーザーでアクセスし、このproject_userの権限を確認すると以下のように表示されます。

mysql> SHOW GRANTS FOR project_user@localhost;
+----------------------------------------------------+
| Grants for project_user@localhost                |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `project_user`@`localhost` |
+----------------------------------------------------+
1 row in set (0.00 sec)
  • GRANT USAGE:「USAGEという最小権限を与える」
  • ON *.*: 「全データベースとその中の全テーブルに対して」

つまり、このproject_userにはproject_databaseを含む全データベースに接続しかできない(読み書き不可な)状態だったということです。

https://www.javadrive.jp/mysql/user/index11.html

これが原因で、何度プロジェクトを実行しても、何度データベースの環境変数や接続関数を見直していじっても一向にデータベースに接続ができない状態でした。。。

データベースへのアクセス権限付与

まずは以下のようにrootユーザーでMySQLへアクセスし、パスワードを入力します。

mysql -u root -p

付与する権限ごとに以下に方法をまとめます。

  • 全権限を付与:
GRANT ALL PRIVILEGES ON project_database.* TO 'project_user'@'localhost';
FLUSH PRIVILEGES;
  • 特定の権限を付与:SELECT, INSERTなど任意の組み合わせでOKです。
GRANT SELECT, INSERT, UPDATE, DELETE ON project_database.* TO 'project_user'@'localhost';
FLUSH PRIVILEGES;
  • 読み取り権限付与:そもそも読み取り権限さえない場合に読み取り権限だけ付与もできます。
GRANT SELECT ON project_database.* TO 'project_user'@'localhost';
FLUSH PRIVILEGES;

その他いろいろ権限がありますが、メインはこんな感じかと思います。

https://www.javadrive.jp/mysql/user/index6.html

以下のOK表示で権限の付与に成功です。

Query OK, 0 rows affected (0.01 sec)

なお、権限がないままプロジェクトを実行すると、以下のエラー文が表示されます。

# 'SELECT'権限がない場合
SELECT command denied to user 'game_item_user'@'localhost' for table 'users'

まとめ

今までの学習ではSQLiteばかり使っていて勉強でMySQLを使い始めると登録やらアクセスやらいろいろ苦戦することが多かったです。

プログラミングを学習していくと言語以外にもいろいろ詰まる部分は多いので、これからも自分が詰まった内容を自分なりにまとめますので、偶然にも同じ苦労を味わっている初学者の方の参考に少しでもなればと思います!!

Discussion