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

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

用户A对OTO3库的权限:

mysql> show grants for 'a'@'%';

+---------------------------------------------------+

| Grants for a@% |

+---------------------------------------------------+

| GRANT USAGE ON *.* TO 'a'@'%' |

| GRANT ALL PRIVILEGES ON `OTO3`.* TO 'a'@'%' |

+---------------------------------------------------+

2 rows in set (0.00 sec)

用户B的权限:

mysql> show grants for 'swper'@'%';

+----------------------------------------------------------------------+

| Grants for swper@% |

+----------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'swper'@'%' |

| GRANT SELECT, UPDATE, DELETE, DROP, ALTER ON `OTO3`.* TO 'swper'@'%' |

+----------------------------------------------------------------------+

2 rows in set (0.00 sec)

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

[root@mysql ~]# mysql -h10.0.10.110 -uswper -p123456

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

mysql> select `name` from mysql.proc where db = 'OTO3' and `type` = 'PROCEDURE';

ERROR 1142 (42000): SELECT command denied to user 'swper'@'mysql' for table 'proc'

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

mysql> grant select on mysql.proc to 'swper'@'%';

Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'swper'@'%';

+----------------------------------------------------------------------+

| Grants for swper@% |

+----------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'swper'@'%' |

| GRANT SELECT, UPDATE, DELETE, DROP, ALTER ON `OTO3`.* TO 'swper'@'%' |

| GRANT SELECT ON `mysql`.`proc` TO 'swper'@'%' |

+----------------------------------------------------------------------+

3 rows in set (0.00 sec)

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

mysql> select `name` from mysql.proc where db = 'OTO3' and `type` = 'PROCEDURE';

+------------------------+

| name |

+------------------------+

| proc_cs |

+------------------------+

1 rows in set (0.00 sec)

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

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| OTO3 |

| mysql |

+--------------------+

3 rows in set (0.00 sec)

mysql库中只有一个表:proc

mysql> use mysql

mysql> show tables;

+-----------------+

| Tables_in_mysql |

+-----------------+

| proc |

+-----------------+

1 row in set (0.00 sec)

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

mysql> show create procedure proc_cs\G

*************************** 1. row ***************************

Procedure: proc_cs

sql_mode: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Create Procedure: CREATE DEFINER=`a`@`%` PROCEDURE `proc_cs`()

BEGIN

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

mysql> ALTER PROCEDURE proc_cs MODIFIES SQL DATA SQL SECURITY INVOKER;

ERROR 1370 (42000): alter routine command denied to user 'b'@'%' for routine 'OTO3.proc_cs'

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

1227 -Access denied;you need(at least one of)the SUPER privilege(s) for this operation

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

1044 - Access denied for user ‘b'@'%' to database ‘OTO3'

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

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

Procedure execution failed

1370 - execute command denied to user ‘b'@'%' for routine ‘OTO3.proc_cs'

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

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

1370 - alter routine command denied to user ‘b'@'%' for routine ‘OTO3.proc_cs'

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

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

mysql> grant execute on OTO3.* to 'b'@'%';

Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'b'@'%';

+-------------------------------------------------------------------------------+

| Grants for b@% |

+-------------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'b'@'%' |

| GRANT SELECT, UPDATE, DELETE, DROP, ALTER, EXECUTE ON `OTO3`.* TO 'b'@'%' |

| GRANT SELECT ON `mysql`.`proc` TO 'b'@'%' |

+-------------------------------------------------------------------------------+

3 rows in set (0.00 sec)

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

时间: 0.080ms

Procedure executed successfully

受影响的行: 0

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

mysql> grant CREATE ROUTINE on OTO3.* to 'b'@'%';

Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'b'@'%';

+-----------------------------------------------------------------------------------------------+

| Grants for b@% |

+-----------------------------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'b'@'%' |

| GRANT SELECT, UPDATE, DELETE, DROP, ALTER, EXECUTE, CREATE ROUTINE ON `OTO3`.* TO 'b'@'%' |

| GRANT SELECT ON `mysql`.`proc` TO 'b'@'%' |

+-----------------------------------------------------------------------------------------------+

3 rows in set (0.00 sec)

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

CREATE DEFINER=`b`@`%` PROCEDURE `aaaa`()

BEGIN

#Routine body goes here...

SELECT * from mysql.user;

END

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

1370 - alter routine command denied to user ‘b'@'%' for routine ‘OTO3.aaaa'

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

mysql> grant alter ROUTINE on OTO3.* to 'b'@'%';

Query OK, 0 rows affected (0.01 sec)

查看用户权限

mysql> show grants for 'b'@'%';

+--------------------------------------------------------------------------------------------------------------+

| Grants for b@% |

+--------------------------------------------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'b'@'%' |

| GRANT SELECT, UPDATE, DELETE, DROP, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `OTO3`.* TO 'b'@'%' |

| GRANT SELECT ON `mysql`.`proc` TO 'b'@'%' |

+--------------------------------------------------------------------------------------------------------------+

3 rows in set (0.00 sec)

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

1227 - Access denied; you need (at least one of)the SUPER privilege(s) for this operation

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

mysql> select * from mysql.user where user='b'\G

*************************** 1. row ***************************

Host: %

User: b

Select_priv: N

Insert_priv: N

Update_priv: N

Delete_priv: N

Create_priv: N

Drop_priv: N

Reload_priv: N

Shutdown_priv: N

Process_priv: N

File_priv: N

Grant_priv: N

References_priv: N

Index_priv: N

Alter_priv: N

Show_db_priv: N

Super_priv: N

Create_tmp_table_priv: N

Lock_tables_priv: N

Execute_priv: N

Repl_slave_priv: N

Repl_client_priv: N

Create_view_priv: N

Show_view_priv: N

Create_routine_priv: N

Alter_routine_priv: N

Create_user_priv: N

Event_priv: N

Trigger_priv: N

Create_tablespace_priv: N

ssl_type:

ssl_cipher:

x509_issuer:

x509_subject:

max_questions: 0

max_updates: 0

max_connections: 0

max_user_connections: 0

plugin: mysql_native_password

authentication_string: *CCB4F88E945E0E14F9BEB093EB797BB0BDBFA175

password_expired: N

password_last_changed: 2017-03-06 11:37:35

password_lifetime: NULL

account_locked: N

1 row in set (0.00 sec)

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

mysql> grant SUPER on OTO3.* to 'b'@'%';

ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES

mysql> grant SUPER on *.* to 'b'@'%';

Query OK, 0 rows affected (0.00 sec)

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

mysql> show grants for 'swper'@'%';

+--------------------------------------------------------------------------------------------------------------+

| Grants for swper@% |

+--------------------------------------------------------------------------------------------------------------+

| GRANT SUPER ON *.* TO 'swper'@'%' |

| GRANT SELECT, UPDATE, DELETE, DROP, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `OTO3`.* TO 'swper'@'%' |

| GRANT SELECT ON `mysql`.`proc` TO 'swper'@'%' |

+--------------------------------------------------------------------------------------------------------------+

3 rows in set (0.00 sec)

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

mysql> select * from mysql.user where user='b'\G

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

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| OTO3 |

| mysql |

+--------------------+

3 rows in set (0.00 sec)

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

mysql> select * from mysql.user where user='b'\G

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

回收一下这个SUPER权限;

mysql> revoke super on *.* from 'b'@'%';

Query OK, 0 rows affected (0.01 sec)

再添加Alter_routine_priv,Create_routine_priv

mysql> grant alter routine,create routine on *.* to 'b'@'%';

Query OK, 0 rows affected (0.00 sec)

查看用户b权限

mysql> show grants for 'b'@'%';

+--------------------------------------------------------------------------------------------------------------+

| Grants for b@% |

+--------------------------------------------------------------------------------------------------------------+

| GRANT CREATE ROUTINE, ALTER ROUTINE ON *.* TO 'b'@'%' |

| GRANT SELECT, UPDATE, DELETE, DROP, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `OTO3`.* TO 'b'@'%' |

| GRANT SELECT ON `mysql`.`proc` TO 'b'@'%' |

+--------------------------------------------------------------------------------------------------------------+

3 rows in set (0.00 sec)

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

1227 - Access denied; you need (at least one of)the SUPER privilege(s) for this operation

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

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| OTO3 |

| mysql |

| performance_schema |

| sys |

| test |

+--------------------+

6 rows in set (0.00 sec)

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

create routine,alter routine;

mysql> revoke create routine,alter routine on *.* from 'b'@'%';

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

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

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

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

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

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

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

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

GRANT SELECT ON MYSQL.PROC TO 'B';

GRANT EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `OTO3`.* TO 'B';

GRANT SUPER ON *.* TO 'B';

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

mysql> show grants for 'b'@'%';

+----------------------------------------------------------------------------------------+

| Grants for b@% |

+----------------------------------------------------------------------------------------+

| GRANT SUPER ON *.* TO 'b'@'%' |

| GRANT SELECT, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `OTO3`.* TO 'b'@'%' |

| GRANT SELECT ON `mysql`.`proc` TO 'b'@'%' |

+----------------------------------------------------------------------------------------+

3 rows in set (0.00 sec)

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

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

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

到此这篇关于Mysql修改存储过程相关权限问题的文章就介绍到这了,更多相关Mysql 存储过程权限内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

mysql 存储过程改用户_Mysql修改存储过程相关权限问题相关推荐

  1. mysql alter 改密码_MySql修改密码

    MySql 这个垃圾,从8.0开始修改密码有了变化,在user表加了字段authentication_string,修改密码前先检查authentication_string是否为空 1.如果不为空 ...

  2. mysql存储过程数组字符串_Mysql通过存储过程分割字符串为数组

    分割字符串为数组需要用到 三个mysql 的函数 : REVERSE(str) 返回颠倒字符顺序的字符串str. SUBSTRING_INDEX(str,delim,count) 返回从字符串str的 ...

  3. mysql授权 改表_mysql开启远程登陆(修改数据表和授权两种方法)

    一.确认防火墙没有阻止3306端口(一般服务器默认会屏蔽掉) windows防火墙例外设置方法 控制面板(右上角选择查看方式为大图标)---防火墙---高级设置---高级设置---出站规则---最右边 ...

  4. mysql数据存储过程详解_mysql数据存储过程参数实例详解

    MySQL 存储过程参数有三种类型:in.out.inout.它们各有什么作用和特点呢? 一.MySQL 存储过程参数(in) MySQL 存储过程 "in" 参数:跟 C 语言的 ...

  5. mysql 存储过程 生成数据_mysql使用存储过程,批量生成测试数据

    1.存储过程代码 delimiter $$ DROP PROCEDURE IF EXISTS create_service_data$$ create procedure create_service ...

  6. mysql命令导入存储过程报错_mysql导入存储过程时declare报错的有关问题解决

    在导入存储过程时经常遇见下列DECLARE报错的问题: ? Error Code : 1064 You have an error in your SQL syntax; check the manu ...

  7. 修改mysql 外删除用户_mysql添加用户、删除用户、授权、修改密码等

    mysql添加用户.删除用户.授权.修改密码等 1.新建用户. //登录MYSQL @>mysql -u root -p @>密码 //创建用户 mysql> mysql> i ...

  8. mysql 怎么改属性_mysql怎么修改字段的属性

    在项目开发中,发现表的某些字段不合理,需要修改怎么处理呢.这时候需要用到关键字alter来修改字段的属性 在mysql中alter命令可以修改字段类型,长度,名称或一些其它的参数,下面我来给大家介绍a ...

  9. xampp修改mysql密码_XAMPP环境下mysql的root用户密码修改方法_MySQL

    XAMPP 最近有客户忘记了mysql的root用户密码,使用mysqld_safe无法正常启动mysql,也没有办法按照mysql manual中的方法修改root密码. 网页教学网站长注:今天有学 ...

最新文章

  1. BTN8982基本测试
  2. echart的x换行
  3. luogu P2516 [HAOI2010]最长公共子序列
  4. shell判断false_Linux脚本shell常用判断式
  5. CIO启示:转向数字业务为传统IT带来颠覆性影响
  6. django前端模板循环多个list
  7. 如果SQL Server 配置管理器没有找到就代表安装失败?
  8. C语言之父Dennis Ritchie告诉你:如何成为世界上最好的程序员?
  9. bean的生命周期(最全最细讲解)
  10. 银河奇异果/云视听企鹅/CIBN/芒果TV哪个好?四款电视视频软件对比评测
  11. html文件怎么转换成视频文件夹,rmvb格式视频怎么转换成wav格式 WAV视频如何转换成RMVB格式...
  12. nginx 解析二级域名
  13. php公众号解决投票刷票,微信公众号投票活动如何防止刷票现象
  14. PTA 7-59 二元一次方程的解
  15. 群晖中安装Firefly记账软件,使用安卓客户端登录
  16. 微信小程序入门教程+案例demo
  17. Glide使用详解(一)
  18. 【高级微观经济学】利润最大化
  19. 新思科技招聘 | 十一月热招职位(外企内推哦)
  20. 火狐浏览器所有版本下载地址

热门文章

  1. 3-idiots HDU - 4609 FFT模板
  2. Connection timed out: connect; Communications link failure
  3. netty中的引导Bootstrap服务端
  4. relative与absolute相结合
  5. 【转】Collections的copy()方法和ArrayList的大小问题
  6. 水果图像识别:基于 Arduino 和 TensorFlow Lite Micro
  7. 年薪40W,如何高效准备大厂AI算法岗面试?
  8. CVPR 2020 论文大盘点-文本图像篇
  9. 紫为云 2020春招开启!算法职位20K-50K!
  10. Kaggle官网免费课程:从Python到机器学习,4小时学完一门,48小时掌握数据科学...