2017-04-08 9 views
0

背景

私はこのようになります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 

分析

我々はが存在し、その列はidjであることがわかっているので、エラーの「定義者/起動者」部分は関連するものでなければなりません。私のユーザlは、ビューの定義者(デフォルトでは定義者の権限を使用します)には何らかの権限が必要です。この結論は、ルートユーザーが作成したときに同じビューにアクセスできるという事実によって裏付けられています。

しかし、私のユーザーはG、データベース内のすべてのオブジェクトに対するすべての権限を持っている:

、その後、 devTestV2から選択することを防止する私のユーザーの欠如を何
> show grants; 
... 
| GRANT ALL PRIVILEGES ON `G`.* TO 'l'@'%' 
... 

+0

ここで何が起こっているのか分かりましたか? – Barmar

+0

@Barmar Nope!私は状況を避けるためにrootユーザーとしてビューを作成することに頼った。 アイデア – user3029121

答えて

0

"create view ..."の代わりに "create SQL SECURITY INVOKER view ..."を試してください この変更を行うまでは同じ問題が発生していました。