問題1:DROP USERで「the user specified as a definer」というエラーが発生した
背景
下記のようにホスト名を指定したユーザーを作成した後、ホスト名を指定していないユーザーをDROP USERしようとした。
username@% <- DROP USERの対象
username@192.168.1.1
原因
既存のviewのdefinerに指定されていたため、該当ユーザーを削除できなかった
MySQL 8.0.22 では、削除するアカウントの名前がストアドオブジェクトの DEFINER 属性として指定されている場合、DROP USER はエラーで失敗します。
対応策
削除しようとしているユーザーがviewのdefinerに定義されていることが原因であるので、definerを変更することで回避できます(?)
別の定義者でオブジェクトを再定義するには、ALTER EVENT または ALTER VIEW を使用して、イベントおよびビューの DEFINER アカウントを直接変更できます。
問題2:マイグレーション時に「」というエラーが発生した
こんな時系列
- マイグレーション専用のMysqlユーザーを使用し、スキーマを渡すことで機械的にマイグレーションができるようにしていた
- viewのdefinerに指定されているユーザーのホスト名指定verユーザーを作成した
- マイグレーション実行時にエラーが発生
原因
ログイン時にはより具体的なユーザーがログイン対象となるため、作成ユーザーと変更ユーザーが異なりマイグレーション時に失敗した。
mysql > SELECT Host, User FROM mysql.user;
+-------------+------------------+
| Host | User |
+-------------+------------------+
| % | migrationer |
| 192.168.1.1 | migrationer |
+-------------+------------------+
definer...migrationer@%
ログインユーザー...migrationer@192.168.1.1
対応策
問題1と同様に、viewのdefinerを変更することで回避できます(?)
たぶん最適解
RDSではMysqlのホスト名を指定するのはやめて、おとなしくセキュリティグループで管理しよう