背景:没有划分数据库权限,所有人共用一个账号

本人公司现有的数据库账号分布情况:

所有人用一个账号(包括程序里面访问数据库的的配置文件里面的账号),该账号除删库权限,其他权限大部分都有。

这样非数据库管理员也可修改数据库,非常不安全。所以想划分权限。

思路:创建3个账号,不同的人用不同账号

一个管理员账号(DBA用,拥有最高权限)

一个账号程序上用(只有增删查改以及调用存储过程函数等权限)

一个账号给程序员用(只有查看权限)

环境:基于阿里云上的RDS实例 (MYSQL)

上面提到的账号是没有创建用户以及删库等权限的,如果需要创建用户等,则需要“创建高权限账号”

步骤:创建“高级权限账号”、程序上访问数据库的账号、只读账号

创建高级权限账号zhangm(相当于管理员账号,但是权限也还是有限制)

登录该“高权限账号”zhangm,创建只读权限用户user1

mysql> create user user1 IDENTIFIED by '';
Query OK, 0 rows affected (0.00 sec)

登录用户user1账号

[root@zhangmeng ~]# mysql  -u user1 -p 123456

查看数据库,发现只能看到information_schema库

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.01 sec)

并且登录这个库,不能看到其他库的对象信息,只能看到该库的对象信息。

mysql> use information_schema;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>
mysql> select * from information_schema.`TABLES`where TABLE_SCHEMA='mofiman';
Empty set (0.01 sec)
mysql>
mysql> select * from information_schema.`TABLES`where TABLE_SCHEMA='mysql';
Empty set (0.01 sec)
mysql>
mysql> select distinct TABLE_SCHEMA from information_schema.`TABLES`;
+--------------------+
| TABLE_SCHEMA |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.01 sec)

如果我们想给用户user1修改密码,该“高权限用户”没有直接修改的权限,只能通过删除用户,再新建用户

mysql> set password for user1 =password('abc123');
ERROR 1044 (42000): Access denied for user 'zhangm1'@'%' to database 'mysql'
mysql>
mysql> drop user user1;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> create user user1 IDENTIFIED by 'abc123';
Query OK, 0 rows affected (0.00 sec)

查看user1用户的权限,我们没有给该用户分配任何权限,可以看到,该用户默认拥有USAGE权限(登录数据库权限)

mysql> mysql> show grants for user1 \G;
*************************** 1. row ***************************
Grants for user1@%: GRANT USAGE ON *.* TO 'user1'@'%' IDENTIFIED BY PASSWORD '*6691484EA6B50DDDE1926A220DA01FA9E575C18A'
1 row in set (0.01 sec)

我准备给user1用户授予查询权限,首先创建一个测试库test,创建一个临时表叫tmp_1,插入几条测试数据

mysql> use test;
Database changed
mysql> create table tmp_1(id int,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tmp_1 values(1,'zm');
Query OK, 1 row affected (0.01 sec) mysql> insert into tmp_1 values(2,'lly');
Query OK, 1 row affected (0.01 sec) mysql> insert into tmp_1 values(3,'jzj');
Query OK, 1 row affected (0.01 sec) mysql> insert into tmp_1 values(4,'fw');
Query OK, 1 row affected (0.00 sec) mysql> select * from tmp_1;
+------+------+
| id | name |
+------+------+
| 1 | zm |
| 2 | lly |
| 3 | jzj |
| 4 | fw |
+------+------+
4 rows in set (0.01 sec)

我们登录user1用户访问数据库test的tmp_1表(以下ip已做处理),提示没有权限

mysql> select * from test.tmp_1;
ERROR 1142 (42000): SELECT command denied to user 'user1'@'192.168.1.1' for table 'tmp_1'

登录“高权限账号”zhangm给user1用户授权查询数据库test所有表的权限(若想精确只授予某个表可以把数据库后面的*改成指定表名)

mysql> grant select on test.*  to user1;
Query OK, 0 rows affected (0.01 sec)

登录user1账号,访问test数据库,发现可以看到test库,并且可以访问表tmp_1,但是如果执行删除操作,会提示没有权限

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
2 rows in set (0.01 sec) mysql> select * from test.tmp_1;
+------+------+
| id | name |
+------+------+
| 1 | zm |
| 2 | lly |
| 3 | jzj |
| 4 | fw |
+------+------+
4 rows in set (0.00 sec) mysql> delete from test.tmp_1 where id=1;
ERROR 1142 (42000): DELETE command denied to user 'user1'@'192.168.1.1' for table 'tmp_1'
mysql>

如果想撤回该权限用 revoke,至此,我们已完成只读用户user1的创建。

至此,只读用户user1的权限分配完成!

mysql> revoke  select on test.*  from  user1;
Query OK, 0 rows affected (0.01 sec)

接下来我们创建程序上用的账号user2(增删查改权限,如有必要添加执行函数和存储过程的权限)

mysql> grant select,update,delete,insert on test.* to user2;
Query OK, 0 rows affected (0.01 sec)

登录账号user2可以查询数据库test的表tmp_1,并且可以插入数据

mysql> select * from test.tmp_1;
+------+------+
| id | name |
+------+------+
| 1 | zm |
| 2 | lly |
| 3 | jzj |
| 4 | fw |
+------+------+
4 rows in set (0.00 sec) mysql>
mysql> insert into test.tmp_1 values(5,'yzw');
Query OK, 1 row affected (0.01 sec)

以上相同部分不在撰述,主要讲一下执行存储过程和函数的权限,所以我们需要分别创建一个简单的存储过程和函数来做测试

在登录“高权限账号”zhangm数据库test创建一个简单的存储过程,发现declare names varchar(20);后面报错,原因是后面带了分号,mysql以为这个语句结束了

mysql> drop PROCEDURE if EXISTS sp_tmp1;
Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> CREATE PROCEDURE sp_tmp1()
-> BEGIN
-> declare names varchar(20);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3
mysql> set @names='';
Query OK, 0 rows affected (0.01 sec)

正确的创建方法是用分隔符  DELIMITER //..... //,

mysql> DELIMITER //
mysql> drop PROCEDURE if EXISTS sp_tmp1;
-> CREATE PROCEDURE sp_tmp1()
-> BEGIN
-> declare names varchar(20);
-> set @names='zm';
-> select @names;
-> END
-> //
Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.00 sec)

函数的创建也是一样的

mysql> DELIMITER //
mysql> drop FUNCTION if EXISTS fc_tmp1;
-> CREATE FUNCTION fc_tmp1 (num INT )
-> RETURNS VARCHAR(20)
-> BEGIN
-> RETURN (SELECT name
-> FROM tmp_1
-> WHERE id=num );
-> END
-> //
Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.00 sec)

登录user2的账号,调用存储过程和函数,提示没有权限

mysql> call test.sp_tmp1();
ERROR 1370 (42000): execute command denied to user 'user2'@'%' for routine 'test.sp_tmp1'
mysql>
mysql> select test.fc_tmp1(1);
ERROR 1370 (42000): execute command denied to user 'user2'@'%' for routine 'test.fc_tmp1'
mysql>

授予user2用户调用存储过程和函数的权限

mysql> grant execute on test.* to user2;
Query OK, 0 rows affected (0.00 sec)

登录user2账号,执行存储过程和函数

至此,程序上访问数据库的账号user2的权限分配完成!

mysql> call test.sp_tmp1();
+--------+
| @names |
+--------+
| zm |
+--------+
1 row in set (0.01 sec) Query OK, 0 rows affected (0.01 sec) mysql> select test.fc_tmp1(1);
+-----------------+
| test.fc_tmp1(1) |
+-----------------+
| zm |
+-----------------+
1 row in set (0.01 sec)

说明:本文为本人原创,部分内容可能参考网上的资料,转载请注明出处,可能有写的不够准确的地方,欢迎指正。

【MYSQL权限】数据库权限部署的更多相关文章

  1. mysql修改数据库表权限

    ps:通常我用的是:1.“grant all on *.* to root@'%' identified by 'yourpassword';”——这个还可以顺带设置密码.2.“flush privi ...

  2. mysql用户授权、数据库权限管理、sql语法详解

    mysql用户授权.数据库权限管理.sql语法详解 —— NiceCui 某个数据库所有的权限 ALL 后面+ PRIVILEGES SQL 某个数据库 特定的权限SQL mysql 授权语法 SQL ...

  3. MySQL数据库权限体系介绍

    本文主要向大家介绍了MySQL数据库权限体系,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 一.权限体系简介: MySQL的权限体系在实现上比较简单,相关权限信息主要存储在mys ...

  4. 涂抹mysql笔记-数据库中的权限体系

    涂抹mysql笔记-数据库中的权限体系<>能不能连接,主机名是否匹配.登陆使用的用户名和密码是否正确.mysql验证用户需要检查3项值:用户名.密码和主机来源(user.password. ...

  5. MySQL数据库权限管理

    # MySQL数据库权限管理 ### 前言------------------------------ 对不同的用户赋予不同级别的访问权限是个好习惯- 杜绝一些恶意用户 ### 参考资料------- ...

  6. 【MySQL数据库权限】RDS for MySQL创建高权限账号

    原文转自:https://help.aliyun.com/document_detail/26130.html?spm=5176.2020520104.201.1.580be8abjlGorJ 为满足 ...

  7. MySQL/MariaDB数据库的用户和权限管理

    MySQL/MariaDB数据库的用户和权限管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.元数据数据库(mysql) 系统授权表(均在mysql数据库中): db hos ...

  8. mysql给数据库授权与收回权限--------dcl

    用户授权语法 grant 权限1,权限2... on 数据库名.* to 用户名 @IP地址或% 打开新创建的名为“test”的数据库后 用 show databases;  的命令 看内部的数据结果 ...

  9. mysql数据库权限

    use mysql select * from user \G; UPDATE user set password=PASSWORD('root') where user='root' grant a ...

随机推荐

  1. [SHOI2010]最小生成树

    题目 首先让其余所有边都减\(1\)和让自己加\(1\)没什么区别 考虑\(kruskal\)的过程 首先边权大于这条边的是不用考虑的 考虑把那些边权比这条边小的调节到比这条边大,这样就相当于在生成树 ...

  2. 3、RabbitMQ-work queues 工作队列

    work queues 工作队列 1.模型图: 为什么会出现 work queues? 前提:使用 simple 队列的时候 我们应用程序在是使用消息系统的时候,一般生产者 P 生产消息是毫不费力的( ...

  3. Golang 单元测试和性能测试

    开发程序其中很重要的一点是测试,我们如何保证代码的质量,如何保证每个函数是可运行,运行结果是正确的,又如何保证写出来的代码性能是好的,我们知道单元测试的重点在于发现程序设计或实现的逻辑错误,使问题及早 ...

  4. MFC窗体程序中添加调试控制台

    在编写复杂程序的过程中,我们经常需要将一些信息输出到文件或者屏幕上.较控制台应用程序,MFC窗体程序要显得麻烦一些! 下面有2种方法来实现为MFC窗体程序添加调试控制台,方便程序员调试程序和了解当前程 ...

  5. python接口自动化读取json,yaml配置文件+封装requests+unittest+HTMLRunner实现全自动化

    # coding=utf-8 import json import requests class TestApi(object): """ /* @param: @ses ...

  6. sharepoint搜索配置问题

    配置sharepoint 爬网内容源,如我们有4台前端服务器,集群域名为eds.jd.com,2台用于爬网前端服务器,集群域名为crawl.eds.jd.com 配置内容源的时候,将地址配为: 结果一 ...

  7. 小程序发微信红包后端Nodejs实现

    前提条件 1.有一个微信开放平台 https://open.weixin.qq.com/ 2.有一个微信公众平台 https://mp.weixin.qq.com  并且开通微信支付 3.有一个微信小 ...

  8. 关于keil不同容量和不同引脚大小的编译以及下载出错问题

    如果遇到这个问题一般可能有四个原因(以STM32F103C8T6为例) 1.芯片型号没有选对 2.startup文件可能没有选对,startup文件常用的分为3种,startup_stm32f10x_ ...

  9. 常用LLDB指令

    print.p: 打印内存地址 po: 打印对象   1.读取内存 memory read/数量格式字节数 内存地址 x/数量格式字节数 内存x/3xw 0x10010 格式:x是16进制,f是浮点, ...

  10. [iOS]app的生命周期

    对于iOS应用程序,关键的是要知道你的应用程序是否正在前台或后台运行.由于系统资源在iOS设备上较为有限,一个应用程序必须在后台与前台有不同的行为.操作系统也会限制你的应用程序在后台的运行,以提高电池 ...