mysql的權(quán)限表有:1、user表,用來(lái)記錄允許連接到服務(wù)器的賬號(hào)信息,該表里啟用的所有權(quán)限都是全局級(jí)的,適用于所有數(shù)據(jù)庫(kù);2、db表,存儲(chǔ)了用戶對(duì)某個(gè)數(shù)據(jù)庫(kù)的操作權(quán)限;3、tables_priv表,用來(lái)對(duì)單個(gè)表進(jìn)行權(quán)限設(shè)置;4、columns_priv表,用來(lái)對(duì)單個(gè)數(shù)據(jù)列進(jìn)行權(quán)限設(shè)置;5、procs_priv表,用于對(duì)存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)進(jìn)行權(quán)限設(shè)置。
本教程操作環(huán)境:windows7系統(tǒng)、mysql8版本、Dell G3電腦。
在 MySQL 數(shù)據(jù)庫(kù)中,權(quán)限表有user 表、db 表、tables_priv 表、columns_priv 表和 procs_priv 表。
user權(quán)限表
user 表是 MySQL 中最重要的一個(gè)權(quán)限表,用來(lái)記錄允許連接到服務(wù)器的賬號(hào)信息。需要注意的是,在 user 表里啟用的所有權(quán)限都是全局級(jí)的,適用于所有數(shù)據(jù)庫(kù)。
user 表中的字段大致可以分為 4 類,分別是用戶列、權(quán)限列、安全列和資源控制列。
用戶列
用戶列存儲(chǔ)了用戶連接 MySQL 數(shù)據(jù)庫(kù)時(shí)需要輸入的信息。需要注意的是 MySQL 5.7 版本不再使用 Password 來(lái)作為密碼的字段,而改成了 authentication_string。
權(quán)限列
權(quán)限列的字段決定了用戶的權(quán)限,用來(lái)描述在全局范圍內(nèi)允許對(duì)數(shù)據(jù)和數(shù)據(jù)庫(kù)進(jìn)行的操作。
權(quán)限大致分為兩大類,分別是高級(jí)管理權(quán)限和普通權(quán)限:
-
高級(jí)管理權(quán)限主要對(duì)數(shù)據(jù)庫(kù)進(jìn)行管理,例如關(guān)閉服務(wù)的權(quán)限、超級(jí)權(quán)限和加載用戶等;
-
普通權(quán)限主要操作數(shù)據(jù)庫(kù),例如查詢權(quán)限、修改權(quán)限等。
user 表的權(quán)限列包括 Select_priv、Insert_ priv 等以 priv 結(jié)尾的字段,這些字段值的數(shù)據(jù)類型為 ENUM,可取的值只有 Y 和 N:Y 表示該用戶有對(duì)應(yīng)的權(quán)限,N 表示該用戶沒(méi)有對(duì)應(yīng)的權(quán)限。從安全角度考慮,這些字段的默認(rèn)值都為 N。
如果要修改權(quán)限,可以使用 GRANT 語(yǔ)句為用戶賦予一些權(quán)限,也可以通過(guò) UPDATE 語(yǔ)句更新 user 表的方式來(lái)設(shè)置權(quán)限。
安全列
安全列主要用來(lái)判斷用戶是否能夠登錄成功,user 表中的安全列如下表所示:
字段名 | 字段類型 | 是否為空 | 默認(rèn)值 | 說(shuō)明 |
---|---|---|---|---|
ssl_type | enum('','ANY','X509','SPECIFIED') | NO | 支持ssl標(biāo)準(zhǔn)加密安全字段 | |
ssl_cipher | blob | NO | 支持ssl標(biāo)準(zhǔn)加密安全字段 | |
x509_issuer | blob | NO | 支持x509標(biāo)準(zhǔn)字段 | |
x509_subject | blob | NO | 支持x509標(biāo)準(zhǔn)字段 | |
plugin | char(64) | NO | mysql_native_password | 引入plugins以進(jìn)行用戶連接時(shí)的密碼驗(yàn)證,plugin創(chuàng)建外部/代理用戶 |
password_expired | enum('N','Y') | NO | N | 密碼是否過(guò)期 (N 未過(guò)期,y 已過(guò)期) |
password_last_changed | timestamp | YES | 記錄密碼最近修改的時(shí)間 | |
password_lifetime | smallint(5) unsigned | YES | 設(shè)置密碼的有效時(shí)間,單位為天數(shù) | |
account_locked | enum('N','Y') | NO | N | 用戶是否被鎖定(Y 鎖定,N 未鎖定) |
注意:即使 password_expired 為“Y”,用戶也可以使用密碼登錄 MySQL,但是不允許做任何操作。
通常標(biāo)準(zhǔn)的發(fā)行版不支持 ssl,讀者可以使用 SHOW VARIABLES LIKE "have_openssl" 語(yǔ)句來(lái)查看是否具有 ssl 功能。如果 have_openssl 的值為 DISABLED,那么則不支持 ssl 加密功能。
資源控制列
資源控制列的字段用來(lái)限制用戶使用的資源,user 表中的資源控制列如表 4 所示。
字段名 | 字段類型 | 是否為空 | 默認(rèn)值 | 說(shuō)明 |
---|---|---|---|---|
max_questions | int(11) unsigned | NO | 0 | 規(guī)定每小時(shí)允許執(zhí)行查詢的操作次數(shù) |
max_updates | int(11) unsigned | NO | 0 | 規(guī)定每小時(shí)允許執(zhí)行更新的操作次數(shù) |
max_connections | int(11) unsigned | NO | 0 | 規(guī)定每小時(shí)允許執(zhí)行的連接操作次數(shù) |
max_user_connections | int(11) unsigned | NO | 0 | 規(guī)定允許同時(shí)建立的連接次數(shù) |
以上字段的默認(rèn)值為 0,表示沒(méi)有限制。一個(gè)小時(shí)內(nèi)用戶查詢或者連接數(shù)量超過(guò)資源控制限制,用戶將被鎖定,直到下一個(gè)小時(shí)才可以在此執(zhí)行對(duì)應(yīng)的操作??梢允褂?GRANT 語(yǔ)句更新這些字段的值。
db表
db 表比較常用,是 MySQL 數(shù)據(jù)庫(kù)中非常重要的權(quán)限表,表中存儲(chǔ)了用戶對(duì)某個(gè)數(shù)據(jù)庫(kù)的操作權(quán)限。表中的字段大致可以分為兩類,分別是用戶列和權(quán)限列。
用戶列
db 表用戶列有 3 個(gè)字段,分別是 Host、User、Db,標(biāo)識(shí)從某個(gè)主機(jī)連接某個(gè)用戶對(duì)某個(gè)數(shù)據(jù)庫(kù)的操作權(quán)限,這 3 個(gè)字段的組合構(gòu)成了 db 表的主鍵。
db 表的用戶列如下表所示:
字段名 | 字段類型 | 是否為空 | 默認(rèn)值 | 說(shuō)明 |
---|---|---|---|---|
Host | char(60) | NO | 無(wú) | 主機(jī)名 |
Db | char(64) | NO | 無(wú) | 數(shù)據(jù)庫(kù)名 |
User | char(32) | NO | 無(wú) | 用戶名 |
權(quán)限列
db 表中的權(quán)限列和 user 表中的權(quán)限列大致相同,只是user 表中的權(quán)限是針對(duì)所有數(shù)據(jù)庫(kù)的,而 db 表中的權(quán)限只針對(duì)指定的數(shù)據(jù)庫(kù)。如果希望用戶只對(duì)某個(gè)數(shù)據(jù)庫(kù)有操作權(quán)限,可以先將 user 表中對(duì)應(yīng)的權(quán)限設(shè)置為 N,然后在 db 表中設(shè)置對(duì)應(yīng)數(shù)據(jù)庫(kù)的操作權(quán)限。
tables_priv表和columns_priv表
tables_priv 表用來(lái)對(duì)單個(gè)表進(jìn)行權(quán)限設(shè)置,columns_priv 表用來(lái)對(duì)單個(gè)數(shù)據(jù)列進(jìn)行權(quán)限設(shè)置。tables_priv 表結(jié)構(gòu)如下表所示:
字段名 | 字段類型 | 是否為空 | 默認(rèn)值 | 說(shuō)明 |
---|---|---|---|---|
Host | char(60) | NO | 無(wú) | 主機(jī) |
Db | char(64) | NO | 無(wú) | 數(shù)據(jù)庫(kù)名 |
User | char(32) | NO | 無(wú) | 用戶名 |
Table_name | char(64) | NO | 無(wú) | 表名 |
Grantor | char(93) | NO | 無(wú) | 修改該記錄的用戶 |
Timestamp | timestamp | NO | CURRENT_TIMESTAMP | 修改該記錄的時(shí)間 |
Table_priv | set('Select','Insert','Update','Delete',' Create','Drop','Grant','References', 'Index','Alter','Create View','Show view','Trigger') |
NO | 無(wú) | 表示對(duì)表的操作權(quán)限,包括 Select、Insert、Update、Delete、Create、Drop、Grant、References、Index 和 Alter 等 |
Column_priv | set('Select','Insert','Update','References') | NO | 無(wú) | 表示對(duì)表中的列的操作權(quán)限,包括 Select、Insert、Update 和 References |
columns_priv 表結(jié)構(gòu)如下表所示:
字段名 | 字段類型 | 是否為空 | 默認(rèn)值 | 說(shuō)明 |
---|---|---|---|---|
Host | char(60) | NO | 無(wú) | 主機(jī) |
Db | char(64) | NO | 無(wú) | 數(shù)據(jù)庫(kù)名 |
User | char(32) | NO | 無(wú) | 用戶名 |
Table_name | char(64) | NO | 無(wú) | 表名 |
Column_name | char(64) | NO | 無(wú) | 數(shù)據(jù)列名稱,用來(lái)指定對(duì)哪些數(shù)據(jù)列具有操作權(quán)限 |
Timestamp | timestamp | NO | CURRENT_TIMESTAMP | 修改該記錄的時(shí)間 |
Column_priv | set('Select','Insert','Update','References') | NO | 無(wú) | 表示對(duì)表中的列的操作權(quán)限,包括 Select、Insert、Update 和 References |
procs_priv表
procs_priv 表可以對(duì)存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)進(jìn)行權(quán)限設(shè)置,procs_priv 的表結(jié)構(gòu)如表所示:
字段名 | 字段類型 | 是否為空 | 默認(rèn)值 | 說(shuō)明 |
---|---|---|---|---|
Host | char(60) | NO | 無(wú) | 主機(jī)名 |
Db | char(64) | NO | 無(wú) | 數(shù)據(jù)庫(kù)名 |
User | char(32) | NO | 無(wú) | 用戶名 |
Routine_name | char(64) | NO | 無(wú) | 表示存儲(chǔ)過(guò)程或函數(shù)的名稱 |
Routine_type | enum('FUNCTION','PROCEDURE') | NO | 無(wú) | 表示存儲(chǔ)過(guò)程或函數(shù)的類型,Routine_type 字段有兩個(gè)值,分別是 FUNCTION 和 PROCEDURE。FUNCTION 表示這是一個(gè)函數(shù);PROCEDURE 表示這是一個(gè) 存儲(chǔ)過(guò)程。 |
Grantor | char(93) | NO | 無(wú) | 插入或修改該記錄的用戶 |
Proc_priv | set('Execute','Alter Routine','Grant') | NO | 無(wú) | 表示擁有的權(quán)限,包括 Execute、Alter Routine、Grant 3種 |
Timestamp | timestamp | NO | CURRENT_TIMESTAMP | 表示記錄更新時(shí)間 |
【