背景
私はこのようになりますMySQLのテーブルG.devTest
ありますMySQLのビュー定義者権限とエラー1356
+----+------+
| id | j |
+----+------+
| 1 | 5 |
| 2 | 9 |
| 3 | 4 |
| 4 | 7 |
+----+------+
私のユーザーl
としてログインし、私が作成し、ベースのシンプルなビューから選択することができます
> create view devTestV as select * from devTest;
Query OK, 0 rows affected (0.02 sec)
> select * from devTestV;
+----+------+
| id | j |
...
問題
:この表では問題なし私はdevTest
に基づいて、このビューを使用したい:
> create view devTestV2 as select a.id, a.j, b.avg from devTest a cross
join (select avg(j) avg from devTest) b;
最初に正常に動作するように見えるが、私はそれを選択しようとすると、物事がゆがんで行く:
> select * from devTestV2;
ERROR 1356 (HY000): View 'G.devTestV2' references invalid table(s)
or column(s) or function(s) or definer/invoker of view lack rights to use
them
分析
我々はが存在し、その列はid
とj
であることがわかっているので、エラーの「定義者/起動者」部分は関連するものでなければなりません。私のユーザl
は、ビューの定義者(デフォルトでは定義者の権限を使用します)には何らかの権限が必要です。この結論は、ルートユーザーが作成したときに同じビューにアクセスできるという事実によって裏付けられています。
しかし、私のユーザーはG
、データベース内のすべてのオブジェクトに対するすべての権限を持っている:
devTestV2
から選択することを防止する私のユーザーの欠如を何
> show grants;
...
| GRANT ALL PRIVILEGES ON `G`.* TO 'l'@'%'
...
?
ここで何が起こっているのか分かりましたか? – Barmar
@Barmar Nope!私は状況を避けるためにrootユーザーとしてビューを作成することに頼った。 アイデア – user3029121