|
GRANT 是 MySQL 中的授权命令,完整的用法语法格式很复杂,但更多使用的是如下形式:GRANT priv_set on dbname to username 其中,priv_set 是表示权限;dbname 是数据库对象;username 表示用户。下表列出了权限关键字:
字段名 | 含义
| all | 允许用户获得 除 grant option 以外的所有权限
| select
| 允许用户获得查询记录的权限
| insert
| 允许用户获得插入记录的权限
| update | 允许用户获得更新记录的权限
| delete
| 允许用户获得删除记录的权限
| create user
| 允许用户获得创建用户的权限
| create view
| 允许用户获得创建视图的权限
| create table
| 允许用户获得创建表的权限
| drop
| 删除表的权限
| reload
| 重新装载授权表的权限
| shutdown
| 重启数据库权限
| process
| 线程管理权限
| file
| 允许用户 SELECT...INTO OUTFILE 和 LOAD DATA INFILE
| grant option
| 允许用户授予别人权限
| references
| 引用外键权限
| index
| 允许用户获得索引权限
| alter routine
| 允许用户获得更改或取消已存储的子程序
| alter
| 允许用户获得修改数据表的权限
| process
| 允许用户获得管理线程的权限
| show view
| 允许用户获得查看视图权限
| show databases
| 允许用户获得查看数据库的权限
| super
| 允许用户获得超级用户的权限
| create temporary tables
| 允许用户获得创建临时表的权限
| look tables
| 允许用户获得锁定数据表的权限
| Execute
| 执行用户获得执行存储过程的权限
| replication slave
| 设定复制主服务器的权限
| replication client
| 设定复制从服务器权限
| usage
| 无任何权限
|
现在创建一个用户 beyes 的用户:mysql> create user 'beyes'@'localhost' identified by '123456';
创建好后,用该用户来登录,然后尝试创建一个数据库:
创建时会发现没有权限的提示:mysql> create database mydb;
ERROR 1044 (42000): Access denied for user 'beyes'@'localhost' to database 'mydb' 这是对的,因为在默认情况下 beyes 用户并没有获得创建数据库的授权,下面用 GRANT 来为它分配权限(使用 root 用户),如下所示:mysql> grant all privileges on *.* to 'beyes'@'localhost';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec) 完后退出 root 用户并切换 beyes 用户来登录:mysql> create database mydb;
Query OK, 1 row affected (0.06 sec)
由上图可见 mydb 这个数据库已经创建成功。
实际上,grant 的功能远不止上面的这个简单应用,既可以用它来创建用户,也可以对用户在多个级别上进行权限管理,这几个级别分别为:全局级,数据库级,数据表级,字段级。
1. 全局级mysql> grant all privileges on *.* to 'beyes'@'%';
Query OK, 0 rows affected (0.00 sec) 上面这条语句授权 beyes 这个用户在任意一台主机上对数据库服务器进行管理。需要注意的是,全部管理权限并不包括将自己的权限再授予其他人。如果希望 beyes 这个用户也具有 grant 的权限,那么上面的语句可改为:mysql> grant all privileges on *.* to 'beyes'@'%' with grant option;
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec) 上面的语句多了个 with grant option 字句。为了验证是否设置成功,那么再切换到 beyes 用户进行测试一下:mysql> grant all privileges on *.* to 'temp'@'localhost';
Query OK, 0 rows affected (0.00 sec) 此时 beyes 用户也可以给其他用户(这里是 temp)用户授权了,进一步用 temp 用户可以验证命令成功:mysql> create database tempdb;
Query OK, 1 row affected (0.00 sec) 实际上,除了 root 外,并不建议其他的用户也有 GRANT 的权限。
使用 CREATE USER 可以创建用户,而使用 GRANT 也可以,并能够直接赋予该用户权限,如:mysql> grant all privileges on *.* to 'temp2'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
2. 数据库级授权
数据库级的权限范围是在给定的一个数据库中的所有目标的操作权限,这些权限会存储在 mysql.db 和 mysql.host 这两个表中。演示如下:#创建一个 temp3 的用户,此时没有什么权限
mysql> create user 'temp3'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
#创建一个数据库
mysql> create database db_temp3;
Query OK, 1 row affected (0.62 sec)
#分配数据库级权限
mysql> grant all privileges on db_temp3.* to 'temp3'@'localhost';
Query OK, 0 rows affected (0.00 sec)
#刷新使生效
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec) 为了验证上面的过程,现在切换到 temp3 这个用来进行测试:#切换数据库
mysql> use db_temp3;
Database changed
#创建一个表
mysql> create table temp3_tb1 (Name varchar(50), age int);
Query OK, 0 rows affected (1.07 sec)
#插入记录操作
mysql> insert into temp3_tb1 values('groad.net', 3);
Query OK, 1 row affected (0.68 sec)
#错误:尝试创建数据库!!
mysql> create database temp3_new;
ERROR 1044 (42000): Access denied for user 'temp3'@'localhost' to database 'temp3_new' 由上可见,对于 temp3 来说,它拥有数据库级的权限,它可以执行创建表,插入记录等操作,但是一旦尝试创建一个新的数据库,那么就发生越权,从而产生错误。
3. 数据表级授权
数据表级的权限范围是在给定一个数据表中的所有目标的权限,这些权限存储在 mysql.tables_priv 中,通常一个数据表所拥有的权限有 select, insert, delete, update 等。下面创建一个用户,它拥有上面的 db_temp3 这个数据库中的 temp3_tb1 这个表的 select, insert, delete, update 等权限:mysql> grant select, insert, delete, update on db_temp3.temp3_tb1 to 'temp31'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec) 现在切换到 temp31 这个用户来登录以操作 db_temp3.temp3_tb1 这个表:mysql> use db_temp3;
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> select * from temp3_tb1;
+-----------+------+
| Name | age |
+-----------+------+
| groad.net | 3 |
+-----------+------+
1 row in set (0.00 sec)
#错误:尝试删除表!!
mysql> drop table temp3_tb1;
ERROR 1142 (42000): DROP command denied to user 'temp31'@'localhost' for table 'temp3_tb1' 由上可见,如果在 temp3_tb1 表中进行查询等操作是可以成功的,但是若尝试删除掉数据表,那么就会出错,因此说明数据表级授权成功。
4. 字段级授权
字段级是在字段一级上对用户进行权限管理,设定用户只有若干字段的某些操作权限,这些权限信息存储在 mysql.columns_priv 表中。其语法形式如:grant insert(columnname) on DB.TB to 'username'@'localhost' identified by 'new_user_password' 其中的 insert(columnname) 表示用户 username 对字段 columnname 拥有插入权限,如果是可读权限,那么写成 select(columnname),更新权限写成update(columnname)。
下面演示一个新用户 temp4 被赋予数据库 db_temp3 中的 temp3_tb1 表中的 Name 字段具有插入和查看的权限:
现用户创建用户并给用户授权:mysql> grant select(Name), insert(Name) on db_temp3.temp3_tb1 to 'temp4'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
切换到 temp4 用户进行测试:#切换数据库
mysql> use db_temp3;
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
#查看 temp3_tb1 表中的 Name 字段
mysql> select Name from temp3_tb1;
+-----------+
| Name |
+-----------+
| groad.net |
+-----------+
1 row in set (0.00 sec)
#错误:越权查看其它的字段
mysql> select * from temp3_tb1;
ERROR 1142 (42000): SELECT command denied to user 'temp4'@'localhost' for table 'temp3_tb1' 由上可见,在 temp4 被授权字段级权限后,只能对 Name 字段进行操作,如果扩大了查看的范围,那么就会报错,由此可见字段级授权成功。
5. 子程序级
对于用户创建存储,修改,执行存储过程或函数等操作,要采用子程序级权限管理,权限信息存储在 mysql.procs_priv 中。SQL 示意语句为:grant execute on procedure XXX.test_pro to 'temp'@'localhost'[/qutoe]
上面的语句含义是,用户 temp 获得数据库 XXX 中 test_pro 的执行权限。
如果是函数,那么 SQL 示意为:
[quote]grant execute on function on XXX.test_func to 'temp'@'localhost' 上面语句的含义是用户 temp 能够执行数据库 XXX 中的 test_func 函数。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|