MySQL 日常运维业务账号权限的控制
在MySQL数据库日常运维中,对业务子账号的权限的统一控制十分必要。
业务上基本分为读账号和写账号两种账号,所以可以整理为固定的存储过程,让数据库自动生成对应的库的账号,随机密码。以及统一的读权限,写权限。(这里没有对 host进行过多的限制。只赋给通用的192.168.% 。有兴趣的同学可以在存储过程加个参数,对host 控制)
delimiter //
set session sql_log_bin=OFF;
drop PROCEDURE IF EXISTS `usercrt` //
CREATE DEFINER=`root`@`localhost` PROCEDURE `usercrt`(dbname varchar(64),type int,username varchar(16))
COMMENT '创建用户 call usercrt(库名,1/0,'') 1写 0读 。最后一个参数为手动指定用户名,没有指定则用户名默认为 库名_w/r'
label:BEGIN
DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE return_str varchar(255) DEFAULT '';
DECLARE n int DEFAULT 12;
DECLARE i INT DEFAULT 0;
DECLARE pri_dbgrant VARCHAR(500);
DECLARE pri_namepre VARCHAR(500);
DECLARE pri_dbname VARCHAR(500);
DECLARE check_user VARCHAR(500);
DECLARE grantsql VARCHAR(200);
DECLARE pri_username VARCHAR(500);
DECLARE pri_grant VARCHAR(500);
DECLARE notice_msg VARCHAR(500);
set notice_msg=' 账号 ';
WHILE i < n DO
SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1));
SET i = i +1;
END WHILE;
IF dbname = '*' THEN
SET pri_dbgrant="*.*";
SET pri_namepre="alldb";
ELSE
select SCHEMA_NAME INTO pri_dbname FROM information_schema.SCHEMATA where SCHEMA_NAME=dbname and SCHEMA_NAME NOT IN ("information_schema","performance_schema","mysql","sys");
IF pri_dbname IS NOT NULL AND pri_dbname !='' THEN
SET pri_namepre=substring(pri_dbname,1,14);
SET pri_dbgrant=concat(pri_dbname,'.*');
ELSE
select concat('库名错误且不能为系统库,请输入:',group_concat(SCHEMA_NAME)) FROM information_schema.SCHEMATA where SCHEMA_NAME NOT IN ("information_schema","performance_schema","mysql","sys");
leave label;
END IF ;
END IF; IF TYPE = 0 THEN
SET pri_username=CONCAT(pri_namepre,'_r');
set pri_grant="GRANT select on ";
set notice_msg=' 读账号 ';
ELSEIF TYPE = 1 THEN
SET pri_username=CONCAT(pri_namepre,'_w');
set pri_grant="GRANT Show view,select,insert,update,delete on ";
set notice_msg=' 写账号 ';
ELSE
select "读写类型不正确 1 写 0 读";
leave label;
END IF; IF username IS NOT NULL AND username !='' THEN
SET pri_username =username;
END IF; select User INTO check_user from mysql.user where user=pri_username AND Host='192.168.%' ;
IF check_user IS NOT NULL AND check_user !='' THEN
SET return_str='';
set grantsql=concat(pri_grant,pri_dbgrant,' to ',pri_username,'@"192.168.%"');
ELSE
set grantsql=concat(pri_grant,pri_dbgrant,' to ',pri_username,'@"192.168.%" identified by ',"'",return_str,"'"); END IF ; SELECT grantsql;
SET @gsql=grantsql;
PREPARE STMT FROM @gsql;
EXECUTE STMT;
DEALLOCATE PREPARE STMT; IF return_str!='' THEN
set @crtsql="create table IF NOT EXISTS tmp_pwd(col varchar(100))";
PREPARE STMT2 FROM @crtsql;
EXECUTE STMT2;
DEALLOCATE PREPARE STMT2;
set @intsql=concat("insert into tmp_pwd(col) values('",return_str,"')");
PREPARE STMT3 FROM @intsql;
EXECUTE STMT3;
DEALLOCATE PREPARE STMT3;
END IF; set @showsql=concat(' show grants for ',pri_username,'@"192.168.%"');
PREPARE STMT4 FROM @showsql;
EXECUTE STMT4;
DEALLOCATE PREPARE STMT4;
SELECT CONCAT('数据库名 ',pri_dbname,notice_msg, pri_username,' 密码 ',return_str); END //
delimiter ;
MySQL 日常运维业务账号权限的控制的更多相关文章
- mysql日常运维与参数调优
		日常运维 DBA运维工作 日常 导数据,数据修改,表结构变更 加权限,问题处理 其它 数据库选型部署,设计,监控,备份,优化等 日常运维工作: 导数据及注意事项 数据修改及注意事项 表结构变更及注意事 ... 
- MySQL日常运维操作---持续更新
		1.查看当前连接数: 这些参数都是什么意思呢? Threads_cached ##mysql管理的线程池中还有多少可以被复用的资源 Threads_connected ##打开的连接数 Threads ... 
- mysql日常运维
		一.Linux内核和发行版本 uname -a cat /etc/issue 二.glibc的版本 /lib/libc.so.6 ---没有man函数据的动态链接库 三.MySQL的版 ... 
- Jenkins日常运维笔记-重启数据覆盖问题、迁移、基于java代码发版(maven构建)
		之前在公司机房部署了一套jenkins环境,现需要迁移至IDC机房服务器上,迁移过程中记录了一些细节:1)jenkins默认的主目录放在当前用户家目录路径下的.jenkins目录中.如jenkins使 ... 
- 有赞MySQL自动化运维之路—ZanDB
		有赞MySQL自动化运维之路—ZanDB 一.前言 在互联网时代,业务规模常常出现爆发式的增长.快速的实例交付,数据库优化以及备份管理等任务都对DBA产生了更高的要求,单纯的凭借记忆力去管理那几十 ... 
- MySQL数据库运维课程
		MySQL数据库运维课程 http://www.dataguru.cn/article-4834-1.html?union_site=comm100 课程大纲 第一课:机器选型.系统规划 第二课:安装 ... 
- linux日常运维工作
		Linux的使用环境也日趋成熟,各种开源产品络绎不绝,大有百花齐放的盛景,那么当Linux落地企业,回归工作时,我们还要面对这Linux运维方面的诸多问题,今天我们特意组织一场有关Linux 在企业运 ... 
- hadoop日常运维与升级总结
		日常运维 升级 问题处理方法 日常运维 进程管理 由于配置文件的更改,需要重启生效, 或者是进程自己因某种致命原因终止, 或者发现进程工作出现异常等情况下,需要进行手动进程的关闭或启动, 或者是增删节 ... 
- zookeeper 用法和日常运维
		本文以ZooKeeper3.4.3版本的官方指南为基础:http://zookeeper.apache.org/doc/r3.4.3/zookeeperAdmin.html,补充一些作者运维实践中的要 ... 
随机推荐
- 在Oracle/SQL Service中通过Function返回Table
			本函数用途:返回一个Table 在Oracle中实现,范例: --在Types中: create or replace type objTable as object ( s_usercode var ... 
- sqlserver变量的生周期
			在声明一个变量后,一旦遇到分号或者go,生命周期就结 DECLARE @num1 int --go ; --go print @num1; --print @num1: 
- javascript requestAnimationFrame vs. setTimeout
			在做javascript动画时,我们常常使用的方法就是通过setTimeout调用告诉浏览器每隔20ms执行一段js代码来对dom对象执行操作,这个貌似没有什么问题,但是当深入理解计算机的fps以及浏 ... 
- 使用.Net访问Office编程接口(PIA和IA的区别)
			在这篇文章里面,我将向大家介绍如何在.Net中访问Office所公开的编程接口.其实,不管是使用哪种具体的技术来针对Office进行开发(比如VSTO,或者用C#编写一个Office Add-in,或 ... 
- Connection to linux server with ORACLE SQL DEVELOPER
			1.Link name is random 2.username and password is database account 3.host name is ip address ifconf ... 
- September 01st 2017 Week 35th Friday
			Each trauma, is another kind of maturity. 每一个创伤,都是另一种成熟. Sometimes the trauma may be too severe to h ... 
- August 18th 2017 Week 33rd Friday
			If you shed tears when you miss the sun, you also miss the stars. 如果你因为错过太阳而哭泣,你也将会错过繁星. If you have ... 
- redis下的持久化保存
			rdb.h rdb.c ---> 完成数据保存到临时文件,再利用rename保存到指定文件的过程: 如果需要写一个数据持久化保存的功能时,可以参考这部分代码: //rdb API int ... 
- Python 执行命令行操作。
			os.system os.popen() commands.getstatusoutput(cmd) (status, output) = commands.getstatusoutput('cat ... 
- c/c++ 中#ifndef和#endif的作用及使用
			有时候我们在编程的时候,希望有些代码在我们需要时编译,不需要时不编译,也就是让它快速注释,这时候即可以考虑#ifdef和#endif,它们会使我们的编译器进行选择性编译.使用方法如下: #includ ... 
