背景
我有一个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
分析
我们知道devTest存在,其列id和j,因此错误的“定义者/调用者”部分必须是相关的。我的用户l,视图的定义者(默认情况下使用定义者的权限)必须缺少一些权限。这一结论得到以下事实的证实:当由root用户创建时,可以访问相同的视图。
然而,我的用户在G数据库中所有对象的所有权限:
> show grants;
...
| GRANT ALL PRIVILEGES ON `G`.* TO 'l'@'%'
...
那么,做我的用户缺乏,防止它从devTestV2选择?
+0
你有没有想过这里发生了什么? –
+0
@Barmar不要!为了避免这种情况,我采取了以root用户身份创建视图。 任何想法? –