JawsDBのINSERTコマンドの権限を復活させる方法

つい先日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_NAMEuserdb_size_mbhas_insert
db_nameuser_name5,5060

上記のhas_insert0になっているとINSERT権限がないということになります。
解決策は無料プランからアップグレードするか、レコード等を削除して容量に空きを作るかになります。

今回は無料プランのまま利用したかったので、不要なレコードを削除しました。

最後にテーブルサイズを再計算するためにテーブルエンジンを同名で更新します。
table_nameのところは自分で使用しているテーブル名に置き換えてください。


ALTER TABLE table_name ENGINE=InnoDB

あとは半日くらい待てばINSERT権限が復活するはずです。

参考