背景
业务授权自己的某个视图的查询权限给另一个账号时, 另一个账号查询报错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
强制导出, 忽略报错