龙空技术网

mysql常见问题之视图权限控制--安全性为DEFINER

波波说运维 220

前言:

眼前小伙伴们对“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