よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

MySQLでViewを使うときに注意すること

MySQL 5系からViewが利用可能となりました。
そんなView機能を利用していて、ネットワーク構成が変更になった場合には気をつけておかなければならないことがあります。
それは、DEFINER節とSQL SECURITY節についてです。

この2つの節の説明は以下のように述べられています。

DEFINER節およびSQL SECURITY節はビューの呼び出しにおいて、アクセス権限をチェックするとき使用すべきセキュリティーコンテキストを規定します。

参考:http://aqua.sun.ddns.vc/free/docs/mysql5.1/views.html

結局はユーザによるアクセス制限だけではなく、View毎にも柔軟なアクセス制御が可能となるということでしょう。#たぶん。
例えば、interuユーザが登録さており、SHOW VIEW権限を持っていたとします。
そんな設定であっても、interuユーザに特定のViewだけは参照できないようにすることも可能となります。#十分に理解できていないので、間違いがありましたら、ご指摘お願いします。

では、どのようなときに注意しなければならないかというと、DBへの接続元が変更になった場合です。

仮にネットワーク構成変更前のユーザおよびホストの設定が以下のようになっていたとします。

mysql> select User,Host from user;

User Host
root %
root 127.0.0.1
interu 192.168.1.11
root localhost

今までが、192.168.1.11からinteruユーザでアクセスしていたとし、ネットワーク構成変更後は、192.168.2.11からアクセスするようになったとします。

そういう場合は、ホスト情報を以下のように変更してあげるのが一般的です。

mysql> grant select on *.* to inteur@192.168.2.11;
mysql> drop user interu@192.168.1.11;

するとユーザおよびホスト設定は以下のようになります。

mysql> select User,Host from user;

User Host
root %
root 127.0.0.1
interu 192.168.2.11
root localhost

以上の変更だけでいいように思うかもしれませんが、このままだと以下のようなエラーが出力されることとなるでしょう。

nativecode=1045 ** Access denied for user 'interu'@'192.168.1.11' (using password: NO)] [ERROR CODE(2)]

※interuユーザでCREATE VIEWを実行したものとします

VIEW以外のテーブルにはアクセス可能だが、どうしてもVIEWだけはアクセスできないときは、以下のSQLを発行してみてください。

mysql> show create view [スキーマ名].[VIEW名]

View Create View
[VIEW名] CREATE ALGORITHM=UNDEFINED DEFINER=`interu`@`192.168.1.11` SQL SECURITY DEFINER VIEW ・・・(略)

これは、CREATE VIEWを実行した際に、デフォルトでDEFINERにuserが、SQL SECURITYにDEFINERが設定されるためです。
ちなみにCREATE VIEW構文はこのようになっています。

CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

今回は、DEFINERのホスト情報が192.168.1.11になっているためアクセスを拒否されます。
そのため、以下のSQLでホスト情報を書き換えてあげましょう。

mysql> ALTER ALGORITHM=UNDEFINED DEFINER=`interu`@`192.168.2.11` SQL SECURITY DEFINER VIEW・・・

SQL SECURITYをINVOKERに設定してやってもOKです。

このようにすることでVIEWの情報を参照することができるようになり、Access deniedのエラーも解消されるはずです。
VIEWを利用している場合にネットワーク構成を変更する場合は注意してくださいね。