ユーザーのグループが"explain $whatever"
(PerlのDBIを使用してDBD::mysql
)mysqlに送信することを許可した場合、データベースを変更したり、重要な情報を漏らしたり、データベースに大きな負荷をかけたりする可能性のあるものは何でも$に入れることができますか?もしそうなら、どのように?
私は、"explain $whatever"
1つで、どのテーブル/列が存在するか(ただし、名前を推測する必要があります)、テーブルに含まれるレコードの数、またはインデックス付きフィールドに特定の値を持つレコードの数を把握できることを知っています。インデックス付けされていないフィールドの内容に関する情報を取得できるとは思いません。
DBD::mysql
複数のステートメントを許可するべきではないので、クエリを実行できるとは思わない(1つのクエリを説明するだけ)。説明しただけで、サブクエリでさえ実行すべきではありません。
しかし、私はmysqlの専門家ではなく、確かに私が気付いていないmysqlの機能があります。
クエリプランを考え出す際に、オプティマイザは実際に式を実行して、インデックス付きフィールドが比較される値を考え出すことができますか?
explain select * from atable where class = somefunction(...)
ここで、atable.class
はインデックス付けされており、一意でclass='unused'
はなく、レコードは見つかりませんがclass='common'
、100万件のレコードが見つかります。「説明」は評価するかもしれsomefunction(...)
ませんか?そして、それがsomefunction(...)
データを変更するように書くことができますか?