Amazon RDS の MySQL で ALTER VIEW できなくて困った話
シャープの RoBoHoN の実機にふれてたいへん感銘を受けた kagata です。プログラマー視点では SDK などを公開してくれないのが物足りないなーなんて思う一方、基本的にはよいものなのでたくさん売れたらいいなとも思っています。がんばってほしいものです。
さて、今回は AWS 上に構築したシステムの運用ではまったドジ話をご紹介します。
状況
今回取り上げるシステムの状況は次のとおりです:
- AWS 上に構築した Web サービス
- データベースは Amazon RDS の MySQL を使用
- MySQL への接続には一般ユーザーを使用。root ユーザーは外部に預けている
- 初期構築時には root ユーザーで DDL を発行した
ALTER VIEW できない!
この環境で作業用の一般ユーザーから所望のビューに対して ALTER VIEW
しようとすると、以下のエラーになります。
[42000][1227] Access denied; you need (at least one of) the SUPER privilege(s) for this operation
SUPER 権限がないとだめ、とのことです。
MySQL のビューは DEFINER というパラメータを持っています。これが当該のビューを CREATE
したユーザーを指しています。
mysql> SHOW CREATE VIEW example_view;
#=> CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `example_view` AS ...
DEFINER が root@% になっていることがわかります。このとき、root@% 以外のユーザーが ALTER VIEW
するには SUPER 権限が必要になる、というわけです。
SUPER 権限も付与できない!
じゃあ作業に使う一般ユーザーに SUPER 権限を付与してやればよいのか、というと(それが運用上適切かどうかはさておき、そもそも)それもできません。
Amazon RDS の MySQL で SUPER 権限を持っているのは、AWS 側が管理用に確保している rdsadmin というユーザーだけです。ふつうにインストールした MySQL なら root ユーザーに最初から SUPER 権限が付与されているはずですが、Amazon RDS ではそれさえも剥奪されています。
MySQL では、自分が持っていない権限を他人に付与することができません。SUPER 権限を持つユーザーが操作できない以上、所望のユーザーに SUPER 権限を付与することもできないというわけです。
なお、先の話でいけば所望のビューの DEFINER を作業用ユーザーに書き換えてしまえればよいわけですが、DEFINER の変更には結局 SUPER 権限が必要になり、堂々巡りです。
追記:それで結局どうしたか
と質問があったので追記しておきますと、結局 ALTER VIEW
するには root ユーザーの管理先に依頼をしなければならず、かといってそれを待つのも時間が惜しい状況だったので、まったく新しいビューを作成してしまいました。ビューを利用するアプリケーションが CakePHP 製だったので、モデルの $useTable
プロパティに新しいビューの名前を書き込んでやるだけで対応できました。
まとめ
- MySQL で
ALTER VIEW
できるのはそのビューの DEFINER と SUPER 権限を持つユーザーのみ - Amazon RDS 上の MySQL ではたとえ root ユーザーであっても SUPER 権限を持てない
- よって、対象ビューの DEFINER として接続できないと
ALTER VIEW
できなくなる
IaaS や PaaS はサービスごとに独特のくせがあって難しいですね。