MySQL的存储过程,没错,看起来好生僻的使用场景。问题源于一个开发同学提交了权限申请的工单,需要开通一些权限。

本来是一个很正常的操作,但在我来看是比较着急且紧迫的,说来惭愧,忙着方向规划和开发的事情,这个基础的操作功能竟然给忽略了,所以看到目前的一些实现方式,还是希望能够做一些细小的事情把这些重复性的工作给解放了。

当然我决定把一些基础性的工作接过来,一方面是给同事减压,另一方面是在做一个完整的体验,因为很多需求和痛点通过实践是能够很容易捕捉到重点的,如果我觉得不合理,那么这个过程中势必会有一些改进的地方。比如部署安装,比如权限开通。数据库的权限开通就是一个相对典型的案例,而存储过程的权限开通甚至都有点让人怀疑人生了。

问题的场景还是很基础的,开发同学需要开通一些基础的权限,在标记权限的时候声明需要增删改查的权限,还有DDL的权限,比如drop,alter,create等等。看到这里,我就感觉不太妥了,什么样的操作竟然需要这么大的权限呢。

简单声明了下立场,开发同学的想法是能够方便管理,于是乎我就直接招过去了,简单沟通下,其实发现他们的需求场景还是很常规的,他们需要动态创建一些日表,那么需要create权限在评估之后是可以给与的,而对于一般的用户而言,create的权限是不建议开放的,主要的出发点就是能够对SQL进行一些基本的审核,哪怕是人工审核还是平台审核都是一个需要的过程。所以沟通了一圈发现,开通的权限就可以迅速裁剪,对他们而言,修改存储过程的逻辑也是需要的,因为在一些特定的场景下,他们对逻辑的控制希望能够更加灵活。

好了,基础的背景介绍完了。赋予基本的表的权限,赋予存储过程的权限,存储过程的这个地方需要注意一个重要的点是SQL SECURITY,默认创建是definer,如果需要开放给其他的用户调用,则建议是设置为invoker.

所以很简单的一句:

grant execute,alter procedure on xxx.xxx to xxx@'xxxx';

但是很不幸的,开发同学反馈,他们通过SQLyog或者是Navicator打开的时候,竟然看不到存储过程的内容。

因为我们没有select procedure或者view procedure的权限,所以我们几乎再无从干预了。

使用命令行的方式能够复现出这个问题:

没有存储过程的实质性内容。在那儿折腾了好一会,发现是个老问题了,10多年前的老问题了。

问题的解决其实很简单,就是需要这样一句:

grant select on mysql.proc to xxxx@'xxxx'即可

所以细粒度的权限控制就是这么纠结,但是确实有效。

比如我们举一反三一下,我们知道MySQL里的all privileges算是一个很大的权限,但是里面包含多少种权限,可能我们没有清晰的概念。

我们就完全可以通过细粒度的权限控制来反推。

比如创建一个用户,赋予all privileges的权限。

mysql> grant all privileges on test.* to 'jeanron'@'%' identified by 'jeanron100';

Query OK, 0 rows affected, 1 warning (0.00 sec)

包含的权限如下:

mysql> show grants for jeanron;

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

| Grants for jeanron@% |

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

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

| GRANT ALL PRIVILEGES ON `test`.* TO 'jeanron'@'%' |

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

2 rows in set (0.00 sec)

我们做一下收缩。

mysql> revoke insert on test.* from jeanron@'%';

Query OK, 0 rows affected (0.00 sec)

喏,all privileges的权限就现出原形了。

mysql> show grants for jeanron;

| Grants for jeanron@%

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

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

| GRANT SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `test`.* TO 'jeanron'@'%' |

所以在上面的问题中,其实如果select on *.*其实已经包含了我们需要的细粒度权限mysql.proc,如果要抽丝剥茧,基本就是这样的套路。

补充:下面看下mysql创建存储过程权限问题

首先,在mysql存储过程出现的同时,用户权限也增加了5种,其中和存储过程有关的权限有 三种:

ALTER ROUTINE 编辑或删除存储过程

CREATE ROUTINE 建立存储过程

EXECUTE 运行存储过程

在使用GRANT创建用户的时候分配这三种权限。 存储过程在运行的时候默认是使用建立者的权限运行的。

需要注意的是在一个用户拥有建立存储过程的权限时,如果其没有对于select、update或delete等权限的话,虽然操作数据的存储过程可以建立,但调用存储过程的话仍是无法成功的,会返回权限错误,就算拥有运行存储过程的权限也一样。所以,如果有人给你建立了一个没有select、update、delete权限只有CREATE ROUTINE权限的用户,骂他吧,他是故意的。

当然这样的用户建立的存储过程倒并不是完全不能使用,创建存储过程中有一个特征子句可以让存储过程使用运行者的权限,在建立存储过程后只要加上SQL SECURITY INVOKER特征子句就可以了。

如下。

CREATE PROCEDURE p() SQL SECURITY INVOKER 这样的话就可以分配两批人,一批给与创建存储过程的权限,作为开发者,一批给与运行存储过程和select、update、delete权限,作为测试者。(脑筋秀逗了) 有了这种权限分配,mysql的安全性完全不需要在功能层去保护了,我通过root用户建立的存储过程,但是在功能层用一个只拥有运行存储过程权限的用户来调用。那么,你就算从功能层上得到数据库的用户名和密码,并且模拟了ip,也不能得到你想要的任何东西。 有了权限,我们可以放心大胆的使用存储过程,不用担心安全问题了。

总结

以上所述是小编给大家介绍的MySQL存储过程的权限问题小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

mysql 存储过程 on_MySQL存储过程的权限问题小结相关推荐

  1. jdbc mysql 存储过程执行失败_JDBC连接执行MySQL存储过程报空指针或权限错误

    JDBC连接执行MySQL存储过程报空指针或权限错误 最近使用root用户编写了几个存储过程,但是使用普通用户通过JDBC连接执行却报错: java.lang.NullPointerException ...

  2. mysql 获取所有用户所有权限存储过程

    自己写的一个存储过程!一次性获取mysql所有用户的所有权限列表! 做权限列表统计的时候这个非常爽! DELIMITER $$ USE `mysql`$$ DROP PROCEDURE IF EXIS ...

  3. 【Mysql】MySQL 用户执行存储过程的权限

    问题 运行存储过程报错: 原因 查询资料: 1305错误,由于当前用户没用权限,对用户进行授权后可以执行. 解决 MySQL创建存储过程/函数需要的权限: alter routine---修改与删除存 ...

  4. MySql数据库学习--存储过程(1)

    在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用户入门. 存储过程介绍 存储过程是一组为了 ...

  5. mysql 列级权限授予用户_mysql 用户及权限管理 小结

    MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL 命令行模式下输入如下命 ...

  6. MySQL入门之存储过程与存储函数

    ---------------------------------------------------------------------------------------------------- ...

  7. MySQL学习——操作存储过程

    MySQL学习--操作存储过程 摘要:本文主要学习了使用DDL语句操作存储过程的方法. 了解存储过程 是什么 存储过程是一组为了完成特定功能的SQL语句集合. 使用存储过程的目的是将常用或复杂的工作预 ...

  8. 系列 | 高性能存储-MySQL数据库之存储过程揭秘

    墨墨导读:本文介绍什么是存储过程?为什么要使用存储过程?如何使用存储过程?如何去使用存储过程以及怎么执行存储过程. DBASK小程序已经开设"MySQL 数据库专栏",欢迎大家关注 ...

  9. MySQL DDL操作--------存储过程最佳实战

    1. 背景 * 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通 ...

最新文章

  1. 2018-2019-1 20165325 20165320 20165337 实验二 固件程序设计
  2. MobileNet-SSD
  3. vs转eclipse之工具快速上手篇
  4. Android .9.png图片的处理
  5. 36 FI配置-财务会计-应收账款和应付账款-为供应商定义备选统驭科目
  6. Android网络类型判断(2g、3g、wifi)
  7. Vue 服务端渲染(SSR)、Nuxt.js - 从入门到实践
  8. libc.so.6: version 'GLIBC_2.14' not found报错提示的解决方案
  9. 基于IAR for RH850的瑞萨RH850 FCL库用法介绍
  10. java后台生成动态二维码
  11. 马拉车算法(Manacher's Algorithm)
  12. 全面掌握Java多线程
  13. 逆流而上:计算机专业图书破圈营销,这个直播间做到了
  14. HashMap常见面试题汇总:建议初步了解源码后再细品
  15. 【游戏逆向】游戏玩家技能冷却分析
  16. 学习excel的使用技巧复制一列文本成新列去重
  17. 大数据|Spark技术在京东智能供应链预测的应用案例深度剖析(一)
  18. python sort多条件排序
  19. Java Web框架play framework的下载与环境变量配置
  20. 一加7t人脸识别_一加7T深度测评:它体现了最佳的技术价值吗?

热门文章

  1. Citrix、Microsoft、VMware虚拟桌面之网页接口登录对比
  2. 探测与响应是各企业机构在2017年的首要安全事务
  3. 《游戏编程模式》一7.8 并发状态机
  4. 朴素贝叶斯和贝叶斯估计_贝叶斯估计收入增长的方法
  5. php pfm 改端口,罗马2ESF和PFM 修改建筑 军团 派系 兵种等等等很多东西的教程
  6. Bootstrap 4:如何使顶部固定的Navbar保持在容器中而不拉伸?
  7. ios jenkins_如何使用Jenkins和Fastlane制作iOS点播构建系统
  8. hitchhiker部署_《 Hitchhiker的React Router v4指南》:路由配置的隐藏值
  9. 大样品随机双盲测试_训练和测试样品生成
  10. python + pyqt5 UI和信号槽分离方法