前言:
眼前小伙伴们对“mysqlfields”都比较关注,兄弟们都需要剖析一些“mysqlfields”的相关知识。那么小编也在网络上网罗了一些关于“mysqlfields””的相关内容,希望同学们能喜欢,你们一起来了解一下吧!概述
前段时间在做数据库备份时提示:
mysqldump: Couldn't execute 'SHOW FIELDS FROM `v_ocs_group_production_lines1`': SELECT command denied to user ''@'%' for column 'work_date' in table 't_ocs_employee_attendace' (1143)
这个报错还是比较常见的问题之一,所以就拿来分析了。
思路:
当视图的安全性为DEFINER时,数据库中存在DEFINER指定的用户,也就是图中的定义者所填写的。并且该用户拥有对应的权限,才能执行。与当前用户是否有权限无关。
当视图的安全性为INVOKER时,只要执行者有执行权限,就可以成功执行。
definer和invoker的区别:
在创建视图或者是存储过程的时候,是需要定义安全验证方式的(也就是安全性SQL SECURITY),其值可以为definer或invoker,表示在执行过程中,使用谁的权限来执行。
definer:由definer(定义者)指定的用户的权限来执行
invoker:由调用这个视图(存储过程)的用户的权限来执行
1、definer
当定义为DEFINER时,必须数据库中存在DEFINER指定的用户,并且该用户拥有对应的操作权限,才能成功执行。与当前用户是否有权限无关。
示例:
CREATE DEFINER=dev@% PROCEDURE p_user_login(IN u_name VARCHAR(25), IN u_password VARCHAR(100))BEGINSELECT u.id, u.name, u.tid, u.status, u.is_report FROM v_user u WHERE u.name=u_name AND u.password=u_password AND u.status=1;END;
2、invoker
当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。
示例:
CREATE DEFINER=dev@% PROCEDURE p_user_login(IN u_name VARCHAR(25), IN u_password VARCHAR(100))SQL SECURITY INVOKERBEGINSELECT u.id, u.name, u.tid, u.status, u.is_report FROM v_user u WHERE u.name=u_name AND u.password=u_password AND u.status=1;END;1、查看视图
这里先看下视图的一些定义。
可以看到定义者是指定用户了。
2、尝试授权
这个时候是授权失败的。
mysql> GRANT SELECT ON test.v_ocs_group_production_lines1 TO 'root'@'localhost';mysql> GRANT SELECT ON test.v_ocs_group_production_lines1 TO 'root'@'%';3、修改definer4、测试
测试通过。
觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~
标签: #mysqlfields