DEFINERとINVOKER

今日は業務で、MySQLと格闘してました。
テーブルの操作とかはある程度今まで行ってたのですが、今日はVIEWに苦しめられました。

あるVIEWにアクセスしようとすると、エラー!

> SELECT * FROM test_view;
Access denied for user: 'user_name@host_name' (Using password: NO)

GRANTについては、テーブルレベルでは制御しておらず、グローバルレベルでしか設定していません。
アクセスしていたユーザにはちゃんと参照できる権限をつけていました。

VIEWについて詳細に調査。

> SHOW CREATE VIEW test_view;
CREATE ALGORITHM = UNDEFINED DEFINER = `user_name2`@`host_name2` SQL SECURITY DEFINER ・・・・

すると、DEFINERの設定にアクセスしていたユーザとは別のユーザが指定されていました。
これによって、VIEWへのアクセスが拒否されてたみたいです。

対応策

  1. ・ DEFINER=以降を正しいuser_name@host_nameに設定
  2. SQL SECURITY INVOKERに設定

するとアクセスできました!

DEFINERとINVOKERの違い

  1. ・DEFINER:DEFINERで定義されたユーザはVIEWにアクセス可能
  2. ・INVOKER:VIEWが生成されたテーブルの権限に基づいてアクセス権限が決まる