概述
資料庫系統預設一個超級管理者root使用者,root使用者擁有操作資料庫系統的進階權限,但是,在實際的應用當中,并不是所有的使用者都需要這些權限,為了資料和資料庫系統的安全性,針對不同的使用者,為其配置設定不同的操作權限是很好的選擇。
資料顯示,建立一個使用者的時候,可以為其指定權限範圍,如果沒有新的授權操作,建立使用者隻能在其規定的權限範圍之内進行操作。操作權限範圍有三個大類,分别是DBA,RESOURCE和CONNECT。
即便是指定了權限範圍,擁有更高授權權限的使用者也可以為其他使用者授予新的權限或者回收已有權限。
但是筆者實驗的時候并沒有成功指定這三種權限範圍,正在尋找新的途徑,本篇部落格以MySQL8.0.12資料庫為例,僅示範預設擁有的CONNECT權限範圍的使用者授權和回收權限的操作。DBA和RESOURCE權限使用者待學習掌握之後進行補充。
建立使用者操作
create user 'username'@'host' identified [with mysql_native_password] by 'pass';
如果建立使用者的時候沒有指定新使用者的權限,預設該使用者擁有CONNECT權限。
操作示範
用root使用者建立一個student使用者
筆者本機配置了path環境變量,是以可以不進入MySQL的bin目錄直接使用mysql指令。有關登入MySQL資料庫的操作可以參看”登入MySQL伺服器“
C:\Windows\system32>mysql -hlocalhost -uroot -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.12 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> # 建立一個使用者
mysql> create user 'student'@'localhost' identified with mysql_native_password by '123456';
Query OK, 0 rows affected (0.04 sec)
mysql> # 檢視使用者表
mysql> select user,host from user;
ERROR 1046 (3D000): No database selected
mysql> use mysql;
Database changed
mysql> select user,host from user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
| student | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| company |
| information_schema |
| mydatabase |
| mysql |
| performance_schema |
| registersystem |
| sys |
| test |
+--------------------+
12 rows in set (0.00 sec)
現在新開一個dos視窗,登入student使用者
Microsoft Windows [版本 10.0.17134.706]
(c) 2018 Microsoft Corporation。保留所有權利。
C:\Windows\system32>mysql -hlocalhost -ustudent -p
Enter password: ******
ERROR 1045 (28000): Access denied for user 'student'@'localhost' (using password: YES)
C:\Windows\system32>mysql -hlocalhost -ustudent -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.12 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> # student使用者登入成功,現在試圖選擇一個資料庫進行操作
mysql> use test;
ERROR 1044 (42000): Access denied for user 'student'@'localhost' to database 'test'
mysql> # 拒絕使用者"student"@"localhost"通路資料庫"test"
使用root使用者為student使用者授予test資料庫中檢視course表的權限
mysql> grant select on table test.course to 'student'@'localhost';
Query OK, 0 rows affected (0.11 sec)
使用student使用者檢視course表
mysql> use test;
Database changed
mysql> select * from course;
+------+--------------+------+---------+
| cno | cname | cpno | ccredit |
+------+--------------+------+---------+
| 1 | 資料庫 | 5 | 4 |
| 2 | 數學 | NULL | 2 |
| 3 | 資訊系統 | 1 | 4 |
| 4 | 作業系統 | 6 | 3 |
| 5 | 資料結構 | 7 | 4 |
| 6 | 資料處理 | NULL | 2 |
| 7 | PASCAL | 6 | 4 |
+------+--------------+------+---------+
7 rows in set (0.00 sec)
mysql> # 查詢成功
mysql> # 試圖修改資料
mysql> update course set cname = '資料庫系統' where cno = '1';
ERROR 1142 (42000): UPDATE command denied to user 'student'@'localhost' for table 'course'
繼續給student使用者授權
mysql> grant select on table test.course to 'student'@'localhost';
Query OK, 0 rows affected (0.11 sec)
mysql> # 給student使用者授予對course表的全部權限
mysql> grant all privileges on table test.course to 'student'@'localhost';
Query OK, 0 rows affected (0.08 sec)
mysql> # 給student使用者授予對student表中sdept列的修改權限
mysql> grant update(Sdept) on test.student to 'student'@'localhost';
Query OK, 0 rows affected (0.01 sec)
使用student操作資料庫
mysql> # 現在student使用者擁有對course表的所有權限
mysql> update course set cname = '資料庫系統' where cno = '1';
Query OK, 1 row affected (0.09 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from course;
+------+-----------------+------+---------+
| cno | cname | cpno | ccredit |
+------+-----------------+------+---------+
| 1 | 資料庫系統 | 5 | 4 |
| 2 | 數學 | NULL | 2 |
| 3 | 資訊系統 | 1 | 4 |
| 4 | 作業系統 | 6 | 3 |
| 5 | 資料結構 | 7 | 4 |
| 6 | 資料處理 | NULL | 2 |
| 7 | PASCAL | 6 | 4 |
+------+-----------------+------+---------+
7 rows in set (0.00 sec)
mysql> # 查詢student表
mysql> select * from student;
ERROR 1142 (42000): SELECT command denied to user 'student'@'localhost' for table 'student'
mysql> select Sdept from student;
ERROR 1142 (42000): SELECT command denied to user 'student'@'localhost' for table 'student'
mysql> update student set Sdept = '修改過的專業名' where Sno = '001';
ERROR 1143 (42000): SELECT command denied to user 'student'@'localhost' for column 'Sno' in table 'student'
權限限制就是這麼嚴格,因為隻對student.Sdept有修改權,連select Sdept以及通過Sno做條件都是不可以的。
回收使用者權限
mysql> # 收回studenth使用者對course表的查詢權限
mysql> revoke select on table test.course from 'student'@'localhost';
Query OK, 0 rows affected (0.06 sec)
student使用者再進行對course表的查詢操作将出現權限限制
mysql> select * from test.course;
ERROR 1142 (42000): SELECT command denied to user 'student'@'localhost' for table 'course'
總結
授予使用者權限
grant <權限>[,<權限>,···]
on <對象類型> <對象名> [,<對象類型> <對象名>,···]
to <使用者> [,<使用者>,···]
[with grant option];
回收使用者權限
revoke <權限>[,<權限>,···]
on <對象類型> <對象名> [,<對象類型> <對象名>,···]
from <使用者> [,<使用者>,···]
[cascade];
說明
給使用者授予所有操作權限使用 all privileges.
如果使用了 [with grant option] 字段修飾,那麼該使用者還可以将這個權限授予其他使用者,如果沒有這個字段修飾,使用者隻能自己使用這個權限而不能授予給其他使用者。
回收權限的時候,如果使用了 cascade 關鍵字,那麼,系統不僅會回收該使用者的這個權限,所有由該使用者授予給其他使用者的這個權限都将會被級聯收回。