首页 > 数据库 >mysql权限的一个细枝

mysql权限的一个细枝

时间:2024-01-23 13:56:23浏览次数:29  
标签:权限 test0629 细枝 T1 mysql 授权 test01

业务需求:对一个用户回收一个表的所有权限,但是之前对这个用户是授权表所在库的整个权。

 背景:某个表后来插入了机密数据,不能再让人随便查阅了。

 

 比如:存在库 test01  库下存在表T1,那mysql是否支持呢,来复盘下整个操作:

 

 首先整库授权:

 grant all privilges on test01.* to test0629;

> show grants for test0629;

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

| Grants for test0629@%                               |

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

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

| GRANT ALL PRIVILEGES ON `test01  `.* TO 'test0629'@'%' |

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

 

2 尝试回收 T1权限

 

revoke  ALL PRIVILEGES on `test01  `.T1 from test0629;

ERROR 1147 (42000): There is no such grant defined for user 'test0629' on host '%' on table 'T1'

可以看到无法回收,因为之前没有对此表单独授权过。

3   那再想一想曲线救国呢,先对这个表授权下,再回收是否就搞定了呢,拭目以待:

 > grant all privileges on Test01.T1 to test0629;                                    

  Query OK, 0 rows affected (0.01 sec)

 

> show grants for test0629;                                   

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

| Grants for test0629@%                                           |

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

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

| GRANT ALL PRIVILEGES ON `test01  `.* TO 'test0629'@'%'             |

| GRANT ALL PRIVILEGES ON `test01  `.`T1` TO 'test0629'@'%' |

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

 

      再回收该表的权限:

 

     revoke  ALL PRIVILEGES on `test01`.T1 from test0629;

     Query OK, 0 rows affected (0.01 sec)

 

     > show grants for test0629;                                    

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

     | Grants for test0629@%                               |

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

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

     | GRANT ALL PRIVILEGES ON `test01`.* TO 'test0629'@'%' |

 

回收后再看看是否还有该表访问权限

 

mysql -hxxxx -Pxxx -utest0629

 

> show databases;

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

| Database           |

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

| test01          |

| information_schema |

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

2 rows in set (0.00 sec)

 

> use test01

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

[test01]> show tables;

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

| Tables_in_Test01  |

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

| T1

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

1 rows in set (0.00 sec)

 

> select * from T1;

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

| a             |b | c                |

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

| 1 | 2 | 3|

| 4 | 5 | 6 |

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

 

可见:对整库授权是无法回收库下单表权限的,因为

 

授权和回收的粒度必须一致的,同样的对所有库授权也是不能单独回收一个库的。

 

因为对所有库授权信息是在mysql.user表里的,该权限表最小粒度是全局权限,不能说去掉一个库,剩余某些库,因为该表没有这个库这字段。

对指定库授权信息是mysql.db表里的,该权限表支持的最小授权单位就是库,如果两个库就会有两条记录,同理,没有表字段。

对表授权信息是在mysql.table表里的,该权限表支持的最小授权单位就是表,同理没有列字段。

同样对列权限也是mysql.columns_priv,该权限表支持的最小授权单位就是列

 

      所以结论是不可行的,曲线救国,虽然回收了表的权限,只是回收了table权限表,db表里还有该权限,所以还是可以访问的,因为权限验证顺序是按照 :

 

             user ->db->table->columns_priv

 

           验证的,db里有就直接验证通过了。

 

但是最终还是要解决问题的,怎么办:

 

  把原来整库权限回收了,再对库下的其他表授权。

 

   ---------虽然笨,但有招胜无招。

————————————————

版权声明:本文为CSDN博主「郭烊千玺」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_42851042/article/details/118335519

标签:权限,test0629,细枝,T1,mysql,授权,test01
From: https://www.cnblogs.com/blog-cyk/p/17982290

相关文章

  • mysql分析sql语句基础工具 -- explain
    分析sql语句explainexplain(sql语句)G;分析结果:idsql语句编号如果是连接查询,表之间是平等关系,编号相同;如果有子查询,编号递增。select——type查询类型table查询针对的表 该值可能是实际的表名或者临时表,derived表示form子查询,null表示无须查表possible_key可能用到的索引ke......
  • MySQL 8.0 的xtrabackup备份
     xtrabackup备份语句:   fname=`date+%F_%H-%M-%S`mkdir-p/mnt/dbbak/db_$fnamextrabackup--defaults-file=/etc/my.cnf-uhyb-phd-h/var/lib/mysql-S/var/lib/mysql/mysql.sock-Hlocalhost--port=3306--backup--parallel=4--target-dir=/mnt/dbbak/db_$f......
  • mysql之my.cnf详解
    值,如果该值为0,则默认值为max_binlog_size(1G);如果不为0,则max_relay_log_size则为最大的relay_log文件大小;relay-log-purge=1#是否自动清空不再需要中继日志时。默认值为1(启用)expire_logs_days=30#超过30天的binlog删除binlog_cache_size=1M#在一个事务中......
  • 随Linux开机自动启动mysql
    在MySQL的管理过程中,会遇到PCServer脱机或者重启,我需要在主机启动后再将MySQL服务启动。如果上百台或者更多的MySQL主机进行维护时,可能会有多台主机出现类似问题,要是每次都手动操作,是很繁琐的事情。我们可以采用随系统一起启动MySQL服务,这样就解决了频繁手动启动MySQL的问题。要实......
  • mysql_safe和mysql_multi
    1mysql_safe原理mysqld_safe其实为一个shell脚本(封装mysqld),启动时需要调用server和database(即/bin和/data目录),因此需要满足下述条件之一:1/bin和/data和mysql_safe脚本位于同一目录;2如果本地目录找不到找到/bin和/data,mysqld_safe试图通过绝对路径定位(/usr/local);shell>......
  • mysqlslap压测
    mysqlslap是MySQL自带的压测工具:time./mysqlslap--no-defaults-usa-pcc.123-P18601--create-schema=test-S/tmp/mysql_sandbox18601.sock--number-of-queries=1000000--concurrency=10--query="select*fromtbwherea='1';" 上面: mysqlslap压测......
  • MySQL事件自动kill运行时间超时的SQL
    delimiter$createeventmy_long_running_trx_monitoronscheduleevery1minutestarts'2015-09-1511:00:00'oncompletionpreserveenabledobegindeclarev_sqlvarchar(500);declareno_more_long_running_trxintegerdefault0;declarec_......
  • MySQL数据库开发规范-EC
    最近一段时间一边在线上抓取SQL来优化,一边在整理这个开发规范,尽量减少新的问题SQL进入生产库。今天也是对公司的开发做了一次培训,PPT就不放上来了,里面有十来个生产SQL的案例。因为规范大部分还是具有通用性,所以也借鉴了像去哪儿和赶集的规范,但实际在撰写本文的过程中,每一条规范的背......
  • MySQL线程状态详解
    前言:我们常用showprocesslist或showfullprocesslist查看数据库连接状态,其中比较关注的是State列,此列表示该连接此刻所在的状态。那么你真的了解不同State值所表示的状态吗?下面我们参考官方文档来一探究竟。以MySQL5.7版本为例官方文档地址:https://dev.my......
  • MySQL学习总结 (InnoDB)
    主要内容:存储结构索引锁事务存储结构表索引组织表:表是根据主键顺序组织存放的。如果表中没有非空惟一索引,引擎会自动创建一个6字节大小的指针。主键的索引是定义索引的顺序,而不是建表时列的顺序。表空间:逻辑结构的最高层,所有的数据都存放在表空间中。段:表空间由各个段组成,常见的段......