つい先日Herokuにデプロイしているアプリが500エラー吐いて止まっていたので、確認したところ下記のエラーが出ておりました。
SQLSTATE[42000]: Syntax error or access violation: 1142 INSERT command denied to user 'username'@'ec2-ip-address.compute-1.amazonaws.com' for table 'table_name' (SQL: insert into `table_name` (`column_name1`, `column_name2`, `column_name3`) values (value1, value2, value3))
何やらINSERTコマンドの権限が取り消されてDBへの書き込みに失敗しているご様子。
データベースはJawsDBの無料プランを使用していたのですが、無料プランだと容量の上限が5MBで上限まで達するとINSERTコマンドが取り消されるようになっているようです。
INSERTコマンドが有効かどうか確認するにはDBにログイン後、下記のコマンドを実行
select
s.schema_name
,sp.grantee user
,cast(round(sum(coalesce(t.data_length + t.index_length, 0)) / 1024 / 1024, 3) as char) db_size_mb
,sp.has_insert
from
information_schema.schemata s
inner join
information_schema.tables t on s.schema_name = t.table_schema
inner join (
select
spi.grantee
,spi.table_schema
,max(
case
when spi.privilege_type = 'INSERT' then 1
else 0
end
) has_insert
from
information_schema.schema_privileges spi
group by
spi.grantee
,spi.table_schema
) sp on s.schema_name = sp.table_schema
group by
s.schema_name
,sp.grantee
,sp.has_insert;
SCHEMA_NAME | user | db_size_mb | has_insert |
db_name | user_name | 5,506 | 0 |
上記のhas_insert
が0
になっているとINSERT権限がないということになります。
解決策は無料プランからアップグレードするか、レコード等を削除して容量に空きを作るかになります。
今回は無料プランのまま利用したかったので、不要なレコードを削除しました。
最後にテーブルサイズを再計算するためにテーブルエンジンを同名で更新します。table_name
のところは自分で使用しているテーブル名に置き換えてください。
ALTER TABLE table_name ENGINE=InnoDB
あとは半日くらい待てばINSERT権限が復活するはずです。