欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL - 用户权限管理

程序员文章站 2022-05-31 18:17:13
...
全局层级

全局权限适用于一个给定服务器中的所有数据库。这些权限存储在 mysql.user 表中。

使用 GRANT ALL ON *.*REVOKE ALL ON *.* 可授予和撤销全局权限。

数据库层级

数据库权限适用于一个给定数据库中的所有目标。这些权限存储在 mysql.db
mysql.host 表中。

GRANT ALL ON db_name.*REVOKE ALL ON db_name.* 可授予和撤销数据库权限。

表层级

表权限适用于一个给定表中的所有列。这些权限存储在 mysql.tables_priv 表中。

GRANT ALL ON db_name.tbl_nameREVOKE ALL ON db_name.tbl_name 可授予和撤销表权限。

列层级

列权限适用于一个给定表中的单一列。这些权限存储在 mysql.columns_priv表中。当使用 REVOKE 时,您必须指定与被授权列相同的列。

子程序层级

CREATE ROUTINE, ALTER ROUTINE, EXECUTEGRANT 权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且,除了 CREATE ROUTINE 外,这些权限可以被授予为子程序层级,并存储在
mysql.procs_priv 表中。




授权

命令:
GRANT privileges ON databasename.tablename TO 'username'@'host'
说明:
  • privileges:用户的操作权限,如 SELECTINSERTUPDATE
    等,如果要授予所的权限则使用 ALL
  • databasename:用户可操作的数据库名
  • tablename:用户可操作的表名,如果要授予该用户对所有数据库和表的相应操作权限则可用通配符 * 表示,如 *.*
例子:
GRANT SELECT, INSERT ON test.user TO 'pig'@'%';
GRANT ALL ON *.* TO 'pig'@'%';

使用 GRANT 语句也可以直接添加用户并同时授权:

GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP 
ON test.user 
TO 'test_user1'@'localhost' 
IDENTIFIED BY 'yourpassword';

每当调整权限后,需要执行以下语句刷新权限:

FLUSH PRIVILEGES;




撤销用户权限

命令:
REVOKE privilege ON databasename.tablename FROM 'username'@'host';
例子:
REVOKE SELECT ON *.* FROM 'pig'@'%';

REVOKE INSERT, UPDATE, DELETE, CREATE, DROP 
ON test.test_user 
FROM 'test_user1'@'localhost';




查看用户权限

命令:
SHOW GRANTS for 'username'@'host';
例子:
mysql> SHOW GRANTS for 'test_user1'@'localhost';
+----------------------------------------------------------------+
| Grants for [email protected]                                |
+----------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test_user1'@'localhost'                 |
| GRANT SELECT ON `test`.`test_user` TO 'test_user1'@'localhost' |
+----------------------------------------------------------------+
2 rows in set (0.00 sec)

可以看到 test_user1 这个用户的权限,其中 USAGE 代表无权限。而他在
test 数据库的 test_user 表拥有 SELECT 的权限。

另一个方法就是直接查看相关权限的表,以上面例子为例:

mysql> select * from tables_priv where User='test_user1' \G;
*************************** 1. row ***************************
       Host: localhost
         Db: test
       User: test_user1
 Table_name: test_user
    Grantor: [email protected]
  Timestamp: 0000-00-00 00:00:00
 Table_priv: Select
Column_priv:
1 row in set (0.04 sec)

ERROR:
No query specified