MySQL查看定义者权限和错误1356

Posted

技术标签:

【中文标题】MySQL查看定义者权限和错误1356【英文标题】:MySQL view definer permissions and error 1356 【发布时间】:2017-09-03 15:28:01 【问题描述】:

背景

我有一个 mysqlG.devTest,如下所示:

+----+------+
| 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 存在,它的列idj 也存在,因此错误的“定义器/调用者”部分必须是相关的。我的用户l,视图的定义者(默认使用定义者的权限)必须缺少一些权限。由 root 用户创建时可以访问相同的视图这一事实证实了这一结论。

但是,我的用户拥有G 数据库中所有对象的所有权限:

> show grants;
...
| GRANT ALL PRIVILEGES ON `G`.* TO 'l'@'%'
...

那么,我的用户缺少什么阻止它从devTestV2 中进行选择?

【问题讨论】:

你有没有弄清楚这里发生了什么? @Barmar 不!我求助于以 root 用户身份创建视图来避免这种情况。有什么想法吗? 【参考方案1】:

代替“创建视图...”尝试“创建 SQL SECURITY INVOKER 视图...” 在进行此更改之前,我遇到了同样的问题。

【讨论】:

以上是关于MySQL查看定义者权限和错误1356的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的定义者(definer)的作用

什么是错误 mysql (#1356)?

MySQL备份1356错误提示修复办法

mysqldump 导出view报错1356,对象无效或者没权限

指定为定义者的用户不存在 - GRANT 无法修复

MySQL 错误 1449:指定为定义者的用户不存在