MySQLのエラー『エラー1142: Command Denied』の解決方法

MySQLで特定のSQL文を実行したときに「ERROR 1142 (42000): Command denied to user」というエラーが発生することがある。このエラーは、現在ログインしているユーザーに対して、その操作を行うための適切な権限が付与されていないことを示す。
- 1. 1. エラーの発生条件
- 2. 2. 主な原因:ユーザー権限の不足
- 3. 3. ユーザーの権限を確認する方法
- 4. 4. 一時的に権限を確認する方法(管理者用)
- 5. 5. 権限を付与する方法
- 6. 6. 特定のコマンドだけがブロックされている場合
- 7. 7. 最小限の権限で構築されたアプリケーションユーザー
- 8. 8. SELECT権限のないテーブルへのアクセス
- 9. 9. 誤って制限された権限の削除
- 10. 10. rootユーザーであっても制限があるケース
- 11. 11. プロシージャ・トリガー・ビューの操作に関する制限
- 12. 12. WordPressやCMSでのエラー発生パターン
- 13. 13. セキュリティポリシーに沿った対応が必要
1. エラーの発生条件
ログインユーザーが、実行しようとしているSQLコマンドに必要な権限を持っていない場合に発生する。
SHOW DATABASES;
ERROR 1142 (42000): SHOW command denied to user 'app_user'@'localhost' for table ''
または、以下のようにテーブル単位での操作でも起こる。
SELECT * FROM sensitive_data;
ERROR 1142 (42000): SELECT command denied to user 'app_user'@'localhost' for table 'sensitive_data'
2. 主な原因:ユーザー権限の不足
MySQLのGRANT文でユーザーに対する権限が限定されている場合、該当のコマンド実行はできない。
3. ユーザーの権限を確認する方法
現在のユーザーが持っている権限を確認するには、次のクエリを使用する。
SHOW GRANTS FOR CURRENT_USER;
または特定ユーザーに対して確認するには以下。
SHOW GRANTS FOR 'app_user'@'localhost';
4. 一時的に権限を確認する方法(管理者用)
rootユーザーまたは管理者権限を持つユーザーでログインし、対象ユーザーの権限を確認する。
mysql -u root -p
SHOW GRANTS FOR 'app_user'@'localhost';
5. 権限を付与する方法
不足している権限をGRANTコマンドで追加する。
GRANT SELECT ON my_database.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;
特定のテーブルに対して付与する場合。
GRANT SELECT, UPDATE ON my_database.users TO 'app_user'@'localhost';
6. 特定のコマンドだけがブロックされている場合
SHOW、DROP、TRUNCATEなどのコマンドが制限されている場合、それに対する明示的な権限が必要。
GRANT SHOW DATABASES ON . TO 'app_user'@'localhost';
7. 最小限の権限で構築されたアプリケーションユーザー
セキュリティの観点から、アプリケーション用ユーザーはSELECT権限のみ付与されているケースが多い。そのため、INSERTやDELETEなどの操作でエラー1142が発生することがある。
8. SELECT権限のないテーブルへのアクセス
データベース内の一部テーブルにのみSELECT権限がない場合もある。その場合、全体でなくテーブル単位で権限を見直す必要がある。
GRANT SELECT ON my_database.sensitive_data TO 'app_user'@'localhost';
9. 誤って制限された権限の削除
REVOKEコマンドで必要な権限まで削除されてしまった場合、再度GRANTが必要になる。
REVOKE ALL PRIVILEGES ON my_database.* FROM 'app_user'@'localhost';
-- その後再付与
GRANT SELECT, INSERT ON my_database.* TO 'app_user'@'localhost';
10. rootユーザーであっても制限があるケース
管理ツールによって制限が課されている場合、rootユーザーでも特定操作がブロックされることがある。この場合、設定ファイル(例: my.cnf)で確認する。
11. プロシージャ・トリガー・ビューの操作に関する制限
以下のようなオブジェクトにアクセスできない場合もエラー1142が表示される。
CREATE TRIGGER …;
-- または
DROP PROCEDURE …;
このような操作には、`CREATE ROUTINE`や`TRIGGER`などの追加権限が必要。
12. WordPressやCMSでのエラー発生パターン
WordPressなどで「このページにアクセスできません」や「データベース接続エラー」として表示されることがある。実際には1142エラーが原因となっている可能性がある。
13. セキュリティポリシーに沿った対応が必要
全権限を付与するのではなく、必要最小限の権限を段階的に追加してエラーを解消するのが安全な方法。
-- 最初はSELECTのみ
GRANT SELECT ON dbname.* TO 'user'@'localhost';
-- 問題なければINSERTやUPDATEを追加
GRANT INSERT, UPDATE ON dbname.* TO 'user'@'localhost';
-
前の記事
MySQLのエラー『Can’t Drop Database; Database Doesn’t Exist』の解決方法 2025.04.22
-
次の記事
FirebaseファイルストレージをReactアプリに統合する 2025.04.22
コメントを書く