MySQLのビューの定義がselect 1となっていた

事象

mysqldumpでビューやトリガーを含むダンプを取得した。
その後、別インスタンスにロードした。
すると、ビューが動かなくなった。
ビューの定義を確認すると以下の様な定義に置き換わっていた。

CREATE ALGORITHM=UNDEFINED DEFINER=`userhoge`@`%` SQL SECURITY DEFINER VIEW `dbhoge`.`view_hoge` AS select 1

なお、ダンプ、ロードに使用したユーザーは移行元、移行先のどちらにも存在している。

原因

移行先にユーザーは存在しなかったため。
正確には、微妙に違うかった。

誤) `userhoge`@`%`
正) `userhoge`@`localhost`

結果、違うユーザーと認識されてしまったようである。

対応方法

取得したダンプを直接編集して、`userhoge`@`localhost` に変更する。
なお、移行元はユーザーが上記2つそれぞれ存在し、移行先はユーザーが1つのみというのも敗因である。
但し、セキュリティと利便性の関係上これは致し方無なので、都度変更する整理とした。
(%のユーザーを作成していると、localhostで接続しても%側が勝つという仕様を読んだ様な…[自信無いし未調査])

補記事項

定義内容とdefinerの確認方法
  • VIEW
select * from information_schema.VIEWS where TABLE_SCHEMA = 'dbhoge';
  • procedure
select * from information_schema.ROUTINES where ROUTINE_SCHEMA = 'dbhoge';

定義後の書換え方法

  • VIEW

alter文で書き換えするしかない

show create view ビュー名

取得した情報をalterに変更し、実行する。
(1個、2個位ならMySQL workbench上でやると楽)

  • procedure

同様にalter文で書き換えするしかない

show create procedure プロシージャ名

取得した情報をalterに変更し、実行する。
(こちらも1個、2個位ならMySQL workbench上でやると楽)