网上单独关于MySQL用户权限或者存储过程的文章有不少,但是关于在存储过程中如何书写用户授权语句,尤其是批量授权的资料却很少。
为什么笔者会遇到在存储过程中书写批量用户授权语句的需求,是因为笔者在日常开发中承担了一部分简单的运维职责(笔者还是很赞同开发兼运维的思想),其中就包括在公司内部机器中搭建MySQL服务。
搭建MySQL服务有一项内容就是配好用户和权限管理。笔者不是专职的数据库运维,在此就举个自认为还算形象的例子:比如MySQL中会有系统库(MySQL自带的,比如mysql、performance_schema等)、测试库和正式库,那么我们可能会划分出三类MySQL账号:(1)program账号:程序用的账号,能够对正式或测试库crud,对系统库的部分表有select权限;(2)query账号:开发者用的账号,对正式库或者测试库都只有select权限,对系统库的部分表有select权限。(3)alpha账号:开发者用的测试账号,对测试库有root权限(all privileges),对正式库只有select的权限,对系统库的部分表有select权限。
那么对于program、query和alpha账号(以及将来要增加的其他账号),都会有个共同的需求:指定系统库的部分表授予select权限。而这些表的数量不算少,如果每增加一个账号,就要把所有授权语句依照账号改一边再执行一遍,显得有点麻烦,不如写个存储过程,输入用户账号信息,然后就能把固定需要授予select的权限语句都执行一遍。
用户授权语句类似于:
GRANT SELECT ON `mysql`.`time_zone` TO 'query'@'%';
在存储过程中书写多个用户授权语句类似于:
DELIMITER //
CREATE PROCEDURE grantProc()
BEGIN
GRANT SELECT ON `performance_schema`.* TO 'query'@'%';
GRANT SELECT ON `mysql`.`time_zone` TO 'query'&