MySQLユーザーがいて、データベース内の他のテーブルではなく、必要なビューのみを表示したい。次のように、特定のビューでのみこのユーザー権限を付与しました。
GRANT SHOW VIEW ON `myDatabase`.`awesome_view` TO 'thisUser'@'%'
show grants;
ステートメント期待どおりに、この権限のみを表示できます。ただし、このユーザーに、これらのビューに関連するテーブルではなく、ビューだけをクエリしてもらいたいのですが、これを行う方法が見つかりません。ユーザーがビューで選択を行うようにしたい場合、テーブルに対しても選択を許可する必要がありますか、それとも間違っていますか?
残りのテーブルでselect
statementを拒否し、コマンドラインで選択を実行しようとすると、次のようになります。
SELECT * FROM myDatabase.fordibenForYouTable;
ERROR 1142 (42000): SELECT command denied to user 'thisUser'@'localhost' for table 'fordibenForYouTable'
それが本当に欲しいことですが、ビューデータを選択した場合も拒否されました。
テーブルではなくビューのみをユーザーが利用できるようにする方法はありますか?
ビューをテーブルとして扱う必要があります。 information_schemaはすでに
走れば
SELECT table_name FROM information_schema.tables
WHERE engine IS NULL;
すべてのビューを取得します。
次のように、ビューのSELECTをユーザーに付与するだけです
GRANT SELECT ON `myDatabase`.`fordibenForYouTable` TO 'thisUser'@'localhost' ;
これを行うと、テーブルへのSELECTアクセス権が必要になります。
確認するには、SHOW GRANTS FOR 'thisUser'@'localhost';
を実行します
また、'thisUser'@'localhost'
に付与されているテーブルレベルのアクセスを確認できるはずです。
SELECT * FROM mysql.tables_priv
WHERE user='thisUser' and Host='localhost'\G
また、myDatabase.fordibenForYouTable
へのテーブルレベルのアクセス権を持つユーザーを確認することもできます
SELECT * FROM mysql.tables_priv
WHERE db='myDatabase' and table_name='fordibenForYouTable'\G
私はこれが古いことを知っていますが、これが私にとってこの問題を解決したものです...
答えは「SQL SECURITY」構文でした。
元のビュー定義では、SQL SECURITYが "INVOKER"に設定されていました。これは、ユーザーがビューとテーブルの両方で選択権限を持つことを余儀なくされたことを意味しました。
SQL SECURITYを "DEFINER"に変更したとき、ユーザーはビューに対してのみ選択権限を与えることができます。