千家信息网

mysql.db数据库层权限该如何设置

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,本文主要给大家简单讲讲mysql.db数据库层权限该如何设置,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mysql.db数据库层权限该如何设置这篇文
千家信息网最后更新 2025年01月20日mysql.db数据库层权限该如何设置

本文主要给大家简单讲讲mysql.db数据库层权限该如何设置,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mysql.db数据库层权限该如何设置这篇文章可以给大家带来一些实际帮助。

1# 数据库层权限记录位置
表级别的权限记录在mysql.tables_priv表中。

(root@localhost)[mysql]> (root@localhost)[mysql]> desc tables_priv;+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+| Field       | Type                                                                                                                              | Null | Key | Default           | Extra                       |+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+| Host        | char(60)                                                                                                                          | NO   | PRI |                   |                             || Db          | char(64)                                                                                                                          | NO   | PRI |                   |                             || User        | char(16)                                                                                                                          | NO   | PRI |                   |                             || Table_name  | char(64)                                                                                                                          | NO   | PRI |                   |                             || Grantor     | char(77)                                                                                                                          | NO   | MUL |                   |                             || Timestamp   | timestamp                                                                                                                         | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP || Table_priv  | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') | NO   |     |                   |                             || Column_priv | set('Select','Insert','Update','References')                                                                                      | NO   |     |                   |                             |+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+8 rows in set (0.00 sec)

然而关于数据库层面的权限记录在mysql.db表中

(root@localhost)[mysql]> desc db;+-----------------------+---------------+------+-----+---------+-------+| Field                 | Type          | Null | Key | Default | Extra |+-----------------------+---------------+------+-----+---------+-------+| Host                  | char(60)      | NO   | PRI |         |       || Db                    | char(64)      | NO   | PRI |         |       || User                  | char(16)      | NO   | PRI |         |       || Select_priv           | enum('N','Y') | NO   |     | N       |       || Insert_priv           | enum('N','Y') | NO   |     | N       |       || Update_priv           | enum('N','Y') | NO   |     | N       |       || Delete_priv           | enum('N','Y') | NO   |     | N       |       || Create_priv           | enum('N','Y') | NO   |     | N       |       || Drop_priv             | enum('N','Y') | NO   |     | N       |       || Grant_priv            | enum('N','Y') | NO   |     | N       |       || References_priv       | enum('N','Y') | NO   |     | N       |       || Index_priv            | enum('N','Y') | NO   |     | N       |       || Alter_priv            | enum('N','Y') | NO   |     | N       |       || Create_tmp_table_priv | enum('N','Y') | NO   |     | N       |       || Lock_tables_priv      | enum('N','Y') | NO   |     | N       |       || Create_view_priv      | enum('N','Y') | NO   |     | N       |       || Show_view_priv        | enum('N','Y') | NO   |     | N       |       || Create_routine_priv   | enum('N','Y') | NO   |     | N       |       || Alter_routine_priv    | enum('N','Y') | NO   |     | N       |       || Execute_priv          | enum('N','Y') | NO   |     | N       |       || Event_priv            | enum('N','Y') | NO   |     | N       |       || Trigger_priv          | enum('N','Y') | NO   |     | N       |       |+-----------------------+---------------+------+-----+---------+-------+22 rows in set (0.00 sec)(root@localhost)[mysql]> select * from db\G*************************** 1. row ***************************                 Host: %                   Db: sample                 User: test1          Select_priv: Y          Insert_priv: N          Update_priv: N          Delete_priv: N          Create_priv: Y            Drop_priv: N           Grant_priv: N      References_priv: N           Index_priv: N           Alter_priv: NCreate_tmp_table_priv: N     Lock_tables_priv: N     Create_view_priv: N       Show_view_priv: N  Create_routine_priv: N   Alter_routine_priv: N         Execute_priv: N           Event_priv: N         Trigger_priv: N1 row in set (0.00 sec)

这条对应的grant语句是:

(root@localhost)[mysql]> show grants for test1;+------------------------------------------------------------------------------------------------------+| Grants for test1@%                                                                                   |+------------------------------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO 'test1'@'%' IDENTIFIED BY PASSWORD '*CFA887C680E792C2DCF622D56FB809E3F8BE63CC' || GRANT SELECT, CREATE ON `sample`.* TO 'test1'@'%'                                                    || GRANT ALL PRIVILEGES ON `sample`.`smp` TO 'test1'@'%'                                                || GRANT SELECT ON `mysql`.`user` TO 'test1'@'%'                                                        |+------------------------------------------------------------------------------------------------------+4 rows in set (0.00 sec)

第二条:
GRANT SELECT, CREATE ON sample.* TO 'test1'@'%'

尝试再增加权限:

(root@localhost)[mysql]> grant all privileges on sample.* to test1;Query OK, 0 rows affected (0.00 sec)(root@localhost)[mysql]> (root@localhost)[mysql]> (root@localhost)[mysql]> select * from db\G*************************** 1. row ***************************                 Host: %                   Db: sample                 User: test1          Select_priv: Y          Insert_priv: Y          Update_priv: Y          Delete_priv: Y          Create_priv: Y            Drop_priv: Y           Grant_priv: N      References_priv: Y           Index_priv: Y           Alter_priv: YCreate_tmp_table_priv: Y     Lock_tables_priv: Y     Create_view_priv: Y       Show_view_priv: Y  Create_routine_priv: Y   Alter_routine_priv: Y         Execute_priv: Y           Event_priv: Y         Trigger_priv: Y1 row in set (0.00 sec)

授予all privileges权限。注意点是grant option并不包含在all privileges里面。可以用with子句

(root@localhost)[mysql]> grant all privileges on sample.* to test1 with grant option;Query OK, 0 rows affected (0.00 sec)(root@localhost)[mysql]> select * from db\G*************************** 1. row ***************************                 Host: %                   Db: sample                 User: test1          Select_priv: Y          Insert_priv: Y          Update_priv: Y          Delete_priv: Y          Create_priv: Y            Drop_priv: Y           Grant_priv: Y      References_priv: Y           Index_priv: Y           Alter_priv: YCreate_tmp_table_priv: Y     Lock_tables_priv: Y     Create_view_priv: Y       Show_view_priv: Y  Create_routine_priv: Y   Alter_routine_priv: Y         Execute_priv: Y           Event_priv: Y         Trigger_priv: Y1 row in set (0.00 sec)

回收all privileges权限, 错误写法,revoke并不能带with grant option来回收grant option

(root@localhost)[mysql]> revoke all privileges on sample.* from test1 with grant option;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 'grant option' at line 1(root@localhost)[mysql]> 

这样写还是不对:

revoke all privileges, grant option  on sample.* from test1;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 'on sample.* from test1' at line 1

分开写就可以了:

(root@localhost)[mysql]> revoke all privileges on sample.* from test1;Query OK, 0 rows affected (0.00 sec)(root@localhost)[mysql]> revoke grant option on sample.* from test1;Query OK, 0 rows affected (0.00 sec)(root@localhost)[mysql]> 

grant option在授予的时候是用with子句,回收的时候需要单独回收。

2#一般用户可访问的数据库:
在test1用户下,查看可以访问的数据库:

(test1@localhost)[(none)]> show databases    -> ;+--------------------+| Database           |+--------------------+| information_schema || mysql              || sample             |+--------------------+3 rows in set (0.00 sec)(test1@localhost)[(none)]> (test1@localhost)[(none)]> (test1@localhost)[(none)]> (test1@localhost)[(none)]> use mysql;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changed(test1@localhost)[mysql]> show tables;+-----------------+| Tables_in_mysql |+-----------------+| user            |                #由于只有user表上被授予了select权限,所以show tables只能看到一个表+-----------------+1 row in set (0.00 sec)(test1@localhost)[mysql]> show grants;+---------------------------------------------------------------------+| Grants for test1@%                                                  |+---------------------------------------------------------------------+| GRANT USAGE ON *.* TO 'test1'@'%' IDENTIFIED BY PASSWORD    || GRANT ALL PRIVILEGES ON `sample`.* TO 'test1'@'%' WITH GRANT OPTION || GRANT ALL PRIVILEGES ON `sample`.`smp` TO 'test1'@'%'               || GRANT SELECT ON `mysql`.`user` TO 'test1'@'%'                       |+---------------------------------------------------------------------+4 rows in set (0.00 sec)-----------------------------------------------------------------+| Grants for test1@%                                                |+-------------------------------------------------------------------+| GRANT USAGE ON *.* TO 'test1'@'%' IDENTIFIED BY PASSWORD  || GRANT ALL PRIVILEGES ON `sample`.`smp` TO 'test1'@'%'             || GRANT SELECT ON `mysql`.`user` TO 'test1'@'%'                     |+-------------------------------------------------------------------+3 rows in set (0.00 sec)(test1@localhost)[mysql]> 

sample数据库是被授予的all privileges,所以全库的表对象都是可用呗test1用户访问。至于mysql,只有user表上有一个select权限,所以也被归类在可用访问的数据库之列,但是实际上用show tables只能看到一个表。

3# 数据库层权限的从无到有,给一个用户授予权限后,db表的变化:
a# 建立一个新的数据库sample2

(root@localhost)[(none)]> create database sample2;Query OK, 1 row affected (0.00 sec)

这个时候查看用户test1所拥有的数据库权限,是只有sample数据库。MYSQL数据库并不显示。

(root@localhost)[mysql]> select * from db\G*************************** 1. row ***************************                 Host: %                   Db: sample                 User: test1          Select_priv: Y          Insert_priv: Y          Update_priv: Y          Delete_priv: Y          Create_priv: Y            Drop_priv: Y           Grant_priv: Y      References_priv: Y           Index_priv: Y           Alter_priv: YCreate_tmp_table_priv: Y     Lock_tables_priv: Y     Create_view_priv: Y       Show_view_priv: Y  Create_routine_priv: Y   Alter_routine_priv: Y         Execute_priv: Y           Event_priv: Y         Trigger_priv: Y1 row in set (0.00 sec)(root@localhost)[mysql]>#这个时候test1用户去尝试访问sample2数据库也是失败的:(test1@localhost)[sample]> use sample2ERROR 1044 (42000): Access denied for user 'test1'@'%' to database 'sample2'(test1@localhost)[sample]>

运行授权语句,对test1受援sample2的select权限,这个时候mysql.db数据库中出现了2行数据,多了一行关于sample2的记录:

(root@localhost)[mysql]> select * from db\G*************************** 1. row ***************************                 Host: %                   Db: sample2                 User: test1          Select_priv: Y          Insert_priv: N          Update_priv: N          Delete_priv: N          Create_priv: N            Drop_priv: N           Grant_priv: N      References_priv: N           Index_priv: N           Alter_priv: NCreate_tmp_table_priv: N     Lock_tables_priv: N     Create_view_priv: N       Show_view_priv: N  Create_routine_priv: N   Alter_routine_priv: N         Execute_priv: N           Event_priv: N         Trigger_priv: N*************************** 2. row ***************************                 Host: %                   Db: sample                 User: test1          Select_priv: Y          Insert_priv: Y          Update_priv: Y          Delete_priv: Y          Create_priv: Y            Drop_priv: Y           Grant_priv: Y      References_priv: Y           Index_priv: Y           Alter_priv: YCreate_tmp_table_priv: Y     Lock_tables_priv: Y     Create_view_priv: Y       Show_view_priv: Y  Create_routine_priv: Y   Alter_routine_priv: Y         Execute_priv: Y           Event_priv: Y         Trigger_priv: Y2 rows in set (0.00 sec)

从记录可用看到test1用户对sample2数据库拥有select权限。也就是访问权限,表示里面的对象都具有。但是里面是没有表的。

(test1@localhost)[(none)]> use sample2;Database changed(test1@localhost)[sample2]> show tables;Empty set (0.00 sec)
#并且test1用户可用select出smp表的数据。(test1@localhost)[sample2]> select * from smp;+------+------+| id   | name |+------+------+|    1 | aaa  |+------+------+1 row in set (0.00 sec)# 然而test1用户并不显示的拥有任在sample2上的表权限。所谓的权限的继承。(test1@localhost)[information_schema]> select * from TABLE_PRIVILEGES where TABLE_SCHEMA='sample2';Empty set (0.00 sec)

#奇怪,并没有给表smp授权select,受援的是select on sample2.*。尝试单独对表收回select 权限:

(root@localhost)[sample2]> revoke select on sample2.smp from test1;ERROR 1147 (42000): There is no such grant defined for user 'test1' on host '%' on table 'smp'#以失败告终。显示的revoke并不能收回隐式继承来的权限。(test1@localhost)[sample2]> show tables;+-------------------+| Tables_in_sample2 |+-------------------+| smp               |+-------------------+1 row in set (0.00 sec)

mysql.db数据库层权限该如何设置就先给大家讲到这里,对于其它相关问题大家想要了解的可以持续关注我们的行业资讯。我们的板块内容每天都会捕捉一些行业新闻及专业知识分享给大家的。

权限 数据 数据库 用户 时候 只有 尝试 专业 子句 实际 对象 行业 语句 不对 一行 专业知识 主题 也就是 书籍 从无到有 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 浙江虚拟服务器管理软件云服务器 焦作大学软件开发在哪个校区 网络安全2.0实施日期 服务器开机需要输入硬盘密码 当网络技术30岁 金山区创新软件开发销售电话 服务器设置密钥登录 哪个数据库不是中文数据库 集客网络技术支撑的了解 重庆特色软件开发概念 什么数据库和安卓 小学生网络安全防护小妙招 三星手机软件开发 g6财务管理系统配置服务器 商周互联网科技 游戏和软件开发专业 车帮主rpc服务器不可用 博山财务办公软件开发报价 小朋友学习网络安全知识 济南京座网络技术有限公司 服务器被锁了 漯河中等计算机网络技术 是否能必然保证网络安全 小企业服务器搭建开题报告 以下哪个不属于数据库设计 谷歌800万台服务器 中国人寿会招软件开发的吗 互联网企业网络安全应对措施 服务器在国外怎么租 网络安全是我们的责任
0