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

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

MySQLで特定のSQL文を実行したときに「ERROR 1142 (42000): Command denied to user」というエラーが発生することがある。このエラーは、現在ログインしているユーザーに対して、その操作を行うための適切な権限が付与されていないことを示す。

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';