[MYSQL案例][020] ERROR 1356 (HY000): View 'xxx' references invalid definer/invoker

2024-05-24 15:14:25 浏览数 (1)

背景

业务授权自己的某个视图的查询权限给另一个账号时, 另一个账号查询报错ERROR 1356

但业务自己的视图是能够正常查询的(虽然没得后面的select的那些表的权限.....)

报错

mysql 8.0: 授权某个视图的查询权限给其它用户, 其它用户查询该权限报错如下

代码语言:javascript复制
ERROR 1356 (HY000): View 'db1.v_1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

分析

其实提示就很明显了. 让检测依赖的 表,字段,函数,definer或者invoker

表字段之类的都是没问题的. 剩下的就是definer和invoker了.

创建视图的时候

如果指定 SQL SECURITY 为Definer(默认). 则只需要definer能够正常使用后面的查询语句即可.

如果指定 SQL SECURITY 为 INVOKER 则查询该视图的账号需要该视图后面的查询语句能够正常执行.

其实就是: 查询视图的时候, 谁执行后面的SELECT. 如果是definer 那就是definer去执行, 如果是invoker, 就是调用者去执行.没得权限就报错

有个小坑:

如果SQL SECURITY为INVOKER , 然后使用definer账号去查询该视图, 是能够正常查询的-_-. (通常为导数据的锅)

感觉像BUG, 有空了再模拟下.

解决办法

方法1: 给使用者后面select的那些表的权限

方法2: 把invoker换成Definer (推荐)

总结

1. 建视图的时候尽量使用默认的Definer(啥也不加).

2. 仔细看报错. 基本上除了BUG, 报错都是提示得最明显的.

参考: https://dev.mysql.com/doc/refman/8.0/en/stored-objects-security.html

补充

今天有同事使用mysqldump导出数据的时候也遇到这个报错了. 使用root账号导出的, 所以不存在权限问题.

登录数据库查看该视图, 发现是其基表不存在了....

解决办法:

1. 删除该视图

2. 找回原基表, 基本上不可能

3. mysqldump导出的时候加上 --force 强制导出, 忽略报错

0 人点赞