1. 程式人生 > 資料庫 >MySQL兩種刪除使用者語句的區別(delete user和drop user)

MySQL兩種刪除使用者語句的區別(delete user和drop user)

Tip:

在MySQL中,我們經常需要建立使用者和刪除使用者,建立使用者時,我們一般使用create user或者grant語句來建立,create語法建立的使用者沒有任何許可權,需要再使用grant語法來分配許可權,而grant語法建立的使用者直接擁有所分配的許可權。在一些測試使用者建立完成之後,做完測試,可能使用者的生命週期就結束了,需要將使用者刪除,而刪除使用者在MySQL中一般有兩種方法,一種是drop user,另外一種是delete from mysql.user,那麼這兩種方法有什麼區別呢?我們這裡通過例子演示。

delete from mysql.user

首先,我們看看delete from mysql.user

的方法。我們建立兩個使用者用來測試,測試環境是MySQL5.5版本,使用者名稱分別為yeyz@'%'和yeyz@'localhost',建立使用者的語法如下:

mysql 15:13:12>>create user yeyz@'%' identified by '123456';
Query OK,rows affected (. sec)
mysql 15:20:01>>grant select,create,update,delete on yeyz.yeyz to yeyz@'%';
Query OK,rows affected (. sec)
mysql 15:29:48>>GRANT USAGE ON yeyz.yeyz TO 'yeyz'@localhost IDENTIFIED BY '123456';
Query OK,rows affected (. sec)
[email protected]:(none) 15:20:39>>show grants for yeyz@'%';
+-----------------------------------------------------------------------------------------------------+
| Grants for yeyz@%                                          |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'yeyz'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
| GRANT SELECT,UPDATE,DELETE,CREATE ON `yeyz`.`yeyz` TO 'yeyz'@'%'                 |
+-----------------------------------------------------------------------------------------------------+

此時我們通過delete的方法手動刪除mysql.user表中的這兩個使用者,在去檢視使用者表,我們發現:

mysql 15:20:43>>delete from mysql.user where user='yeyz';
Query OK,rows affected (. sec)

mysql 15:21:40>>select user,host from mysql.user;
+------------------+-----------------+
| user       | host      |
+------------------+-----------------+
| dba_yeyz     | localhost    |
| root       | localhost    |
| tkadmin     | localhost    |
+------------------+-----------------+
 rows in set (. sec)

已經沒有這兩個yeyz的使用者了,此時我們使用show grants for命令檢視剛才刪除的使用者,我們發現依舊是存在這個使用者的許可權說明的:

mysql 15:24:21>>show grants for yeyz@'%';
+-----------------------------------------------------------------------------------------------------+
| Grants for yeyz@%                                          |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'yeyz'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
| GRANT SELECT,CREATE ON `yeyz`.`yeyz` TO 'yeyz'@'%'                 |
+-----------------------------------------------------------------------------------------------------+
 rows in set (0.00 sec)

說明我們雖然從mysql.user表裡面刪除了這個使用者,但是在db表和許可權表裡面這個使用者還是存在的,為了驗證這個結論,我們重新建立一個yeyz@localhost的使用者,這個使用者我們只給它usage許可權,其他的許可權我們不配置,如下:

mysql ::>>GRANT USAGE ON yeyz.yeyz TO 'yeyz'@localhost IDENTIFIED BY '123456';
Query OK,rows affected (. sec)

這個時候,我們使用yeyz@localhost這個使用者去登陸資料庫服務,然後進行相關的update操作,如下:

[dba_mysql@tk-dba-mysql-stat-- ~]$ /usr/local/mysql/bin/mysql -uyeyz --socket=/data/mysql_4306/tmp/mysql.sock --port= -p -hlocalhost
Enter password: 
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 
Server version: 5.5.-log MySQL Community Server (GPL)

Copyright (c),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--yeyz@localhost:(none) 15:31:05>>select * from yeyz.yeyz;
+------+
| id  |
+------+
|  3 |
|  4 |
|  5 |
+------+
 rows in set (. sec)

mysql--yeyz@localhost:(none) 15:31:16>>delete from yeyz.yeyz where id=;
Query OK,row affected (. sec)

mysql--yeyz@localhost:(none) 15:31:32>>select * from yeyz.yeyz;
+------+
| id  |
+------+
|  3 |
|  4 |
+------+
 rows in set (. sec)

最終出現的結果可想而知,一個usage許可權的使用者,對資料庫總的表進行了update操作,而且還成功了。這一切得益於我們delete from mysql.user的操作,這種操作雖然從user表裡面刪除了記錄,但是當這條記錄的host是%時,如果重新建立一個同名的新使用者,此時新使用者將會繼承以前的使用者許可權,從而使得使用者許可權控制失效,這是很危險的操作,儘量不要執行。

再開看看drop的方法刪除使用者

首先,我們刪除掉剛才的那兩個使用者,然後使用show grants for語句檢視他們的許可權:

mysql ::>>drop user yeyz@'%';
Query OK,rows affected (0.00 sec)
mysql ::>>drop user yeyz@'localhost';
Query OK,rows affected (0.00 sec)
mysql ::>>
mysql ::>>show grants for yeyz@'%';
ERROR (): There is no such grant defined for user 'yeyz' on host '%'
mysql ::>>show grants for yeyz@'localhost';
ERROR (): There is no such grant defined for user 'yeyz' on host '192.168.18.%'

可以看到,許可權已經完全刪除了,此時我們重新建立一個只有select許可權的使用者:

mysql ::>>GRANT SELECT ON *.* TO 'yeyz'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';
Query OK,rows affected (. sec)

我們使用這個使用者登入到資料庫服務,然後嘗試進行select、update以及create操作,結果如下:

[dba_mysql@tk-dba-mysql-stat-10-104 ~]$ /usr/local/mysql/bin/mysql -uyeyz --socket=/data/mysql_4306/tmp/mysql.sock --port=4306 -p -hlocalhost
Enter password: 
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 
Server version: 5.5.19-log MySQL Community Server (GPL)

Copyright (c),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 ::>>select * from yeyz.yeyz;
+------+
| id  |
+------+
|   |
|   |
|   |
+------+
 rows in set (0.00 sec)

mysql ::>>update yeyz.yeyz set id= where id=;
ERROR (): UPDATE command denied to user 'yeyz'@'localhost' for table 'yeyz'
mysql ::>>create table test (id int);
ERROR (D000): No database selected
mysql ::>>create table yeyz.test (id int);
ERROR (): CREATE command denied to user 'yeyz'@'localhost' for table 'test'

可以發現,這個使用者只可以進行select操作,當我們嘗試進行update操作和create操作的時候,系統判定這種操作沒有許可權,直接拒絕了,這就說明使用drop user方法刪除使用者的時候,會連通db表和許可權表一起清除,也就是說刪的比較乾淨,不會對以後的使用者產生任何影響。

結論:

當我們想要刪除一個使用者的時候,儘量使用drop user的方法刪除,使用delete方法可能埋下隱患,下次如果建立同名的使用者名稱時,許可權控制方面存在一定的問題。

這個演示也解決了一些新手朋友們的一個疑問:為什麼我的使用者只有usage許可權,卻能訪問所有資料庫,並對資料庫進行操作?這個時候,你需要看看日誌,查詢自己有沒有進行過delete from mysql.user的操作,如果有,這個問題就很好解釋了。

以上就是MySQL兩種刪除使用者語句的區別(delete user和drop user)的詳細內容,更多關於MySQL 刪除使用者的資料請關注我們其它相關文章!