天天看点

Mysql修改存储过程相关权限问题

   在使用mysql数据库经常都会遇到这么一个问题,其它用户定义的存储过程,现在使用另一个用户却无法修改或者删除等;正常情况下存储过程的定义者对它有修改、删除的权限;但是其它的用户就要相于的授权,不然无法查看、调用;

    mysql 中使用用户A创建一个存储过程,现在想通过另一个用户B来修改A创建的存储过程;以下记录就是基于这样的情况产生的;

Mysql修改存储过程相关权限问题

用户A对OTO3库的权限:

用户B的权限:

以用户B的身份登陆Mysql操作;

查存储过程列表时就提示没有权限了:

以root身份给B用户添加一个查看存储过程的权限:

再回到B用户里查看存储过程列表:

此时发现多了一个mysql库,但只有对mysql.proc有查询权限:

mysql库中只有一个表:proc

同样也可以看到存储过程的详细信息:

尝试修改存储过程的配置:

为了方便查看在Navicat工具上尝试修改存储过程,在保存的时候报如下权限问题:

尝试添加一个存储过程,报权限信息:

#这里表示b用户没有对OTO3有授权存储过程的修改权限;

以B用户尝试调用一下存储过程:

#这里很明显连运行权限也没有;

尝试删除原有的a用户定义的存储过程,也会报权限信息,如下:

可以看出B用户连调用存储过程的权限都没有,这里先加入执行权限:

接下来添加一个执行存储过程的权限:

再次执行一下存储过程,发现成功了;

时间: 0.080ms

Procedure executed successfully

受影响的行: 0

那再添加一下创建添加存储过程的权限:

上面添加权限后就可以创建存储过程了;

但是自己创建的都无法删除;

接下来再添加一个修改的权限,也可以删除的哦;

上面添加完alter ROUTINE权限后就可以对OTO3所有的存储过程有删除权限[自己定义的增、删、改],别人定义的可以删除,但是还不能修改;修改别人定义的存储过程会有如下提示:

这里说明一下这个SUPER权限在哪里?通过查看用户权限原来在这里:

尝试添加一下这个SUPER权限看看:

不能对指定的库执行这个权限,因为SUPER为全局的就是整个mysql的权限;

再次检查时会发现 Super_priv: Y 变化了;再修改一下别人定义的存储过程;

查看所有数据库,发现mysql库只有一张proc表有读取的权限,SUPER并非我所想象中那么强大;

仔细观看会发现执行语句:

可以看到有   Create_routine_priv: N和 Alter_routine_priv: N 这两个明显就是对存储过程的权限嘛,能不能不用SUPER而使用这两个权限呢?

回收一下这个SUPER权限;

再添加Alter_routine_priv,Create_routine_priv

发现还是报相同的权限问题:

执行上面权限后发现,可以看到其它的系统库:[例如sys库也有存储过程,由于这两个权限是全局的]

这两个权限更大,连系统库sys中的存储过程都能看到,甚至修改删除,非常危险;决定再次回收权限create routine,alter routine;

还是使用SUPER权限比较安全;

通过上面的测试得出以下结论:

1、查看存储过程权限:SELECT  #是对mysql.proc表的权限;

2、执行存储过程权限:EXECUTE   #是对指定数据库的权限;

3、创建存储过程权限:CREATE ROUTINE #是对指定数据库的权限;

4、修改存储过程权限:ALTER ROUTINE  #是对指定数据库的中自己定义的存储过程;

5、修改别人定义的存储过程权限:SUPER  #是对全局整个mysql的权限;

简来说用户A在数据库OTO3中定义了一个存储过程,现在想用用户B来执行、修改存储过程,需要对用户B添加以下权限:

所以用户B的最基本的权限:

至此,对于Mysql中以另的用户修改其它人定义的存储过程权限也就非常的显白了;

如果不是以另一个用户身份调用存储过程,可以使用root权限修改存储过程的定义者; 这样就等于linux里的所有者权限变更了;

update mysql.proc set DEFINER='b'@'%' WHERE NAME='proc_cs' AND db='OTO3'; 

本文转自yunlielai51CTO博客,原文链接:http://blog.51cto.com/4925054/1979313,如需转载请自行联系原作者