MySQL權限系統保證所有的用戶可以嚴格地做他們假定被允許做的事情。當你連接一個MySQL服務器時, 你的身份由你從那連接的主機和你指定的用戶名來決定,系統根據你的身份和你想做什麼來授予權限。
MySQL在認定身份中考慮你的主機名和用戶名字,是因為有很小的原因假定一個給定的用戶在因特網上屬於同一個人。例如,用戶從whitehouse.gov連接的bill不必和從mosoft.com連接bill是同一個人。 MySQL通過允許你區分在不同的主機上碰巧有同樣名字用戶來處理它:你可以對從whitehouse.gov連接授與bill一個權限集,而為從microsoft.com的連接授予一個不同的權限集。
MySQL存取控制包含2個階段:
階段1:服務器檢查你是否允許連接。
階段2:假定你能連接,服務器檢查你發出的每個請求。看你是否有足夠的權限實施它。例如,如果你從數據庫中一個表精選(select)行或從數據庫拋棄一個表,服務器確定你對表有select權限或對數據庫有drop權限。
服務器在存取控制的兩個階段使用在MySQL的數據庫中的user、db和host表,在這些授權表中字段如下:
表名稱 user db host
范圍字段 Host Host Host
User Db Db
PassWord User
權限字段 Select_priv Select_priv Select_priv
Insert_priv Insert_priv Insert_priv
Update_priv Update_priv Update_priv
Delete_priv Delete_priv Delete_priv
Index_priv Index_priv Index_priv
Alter_priv Alter_priv Alter_priv
Create_priv Create_priv Create_priv
Drop_priv Drop_priv Drop_priv
Grant_priv Grant_priv Grant_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv
對存取控制的第二階段(請求證實),如果請求涉及表,服務器可以另外參考tables_priv和columns_priv表。這些表的字段如下:
表名稱 tables_priv columns_priv
范圍字段 Host Host
Db Db
User User
Table_name Table_name
Column_name
權限字段 Table_priv Column_priv
Column_priv
其他字段 Timestamp Timestamp
Grantor
每個授權表包含范圍字段和權限字段。
范圍字段決定表中每個條目的范圍,即,條目適用的上下文。例如, 一個user表條目的Host和User值為'thomas.loc.gov'和'bob'將被用於證實來自主機thomas.loc.gov的bob對服務器的連接。同樣,一個db表條目的Host、User和Db字段的值是'thomas.loc.gov'、'bob'和'reports'將用在bob從主機聯接thomas.loc.gov存取reports數據庫的時候。 tables_priv和columns_priv表包含范圍字段,指出每個條目適用的表或表/列的組合。
對於檢查存取的用途,比較Host值是忽略大小寫的。User、PassWord、Db和Table_name值是區分大小寫的。Column_name值在MySQL3.22.12或以後版本是忽略大小寫的。
權限字段指出由一個表條目授予的權限,即,可實施什麼操作。服務器組合各種的授權表的信息形成一個用戶權限的完整描述。為此使用的規則在6.8 存取控制, 階段2:請求證實描述。
范圍字段是字符串,如下所述;每個字段的缺省值是空字符串:
字段名 類型
Host CHAR(60)
User CHAR(16)
PassWord CHAR(16)
Db CHAR(64) (tables_priv和columns_priv表為CHAR(60))
在user、db和host表中,所有權限字段被聲明為ENUM('N','Y')--每一個都可有值'N'或'Y',並且缺省值是'N'.
在tables_priv和columns_priv表中,權限字段被聲明為SET字段:
表名 字段名 可能的集合成員
tables_priv Table_priv 'Select', 'Insert', 'Update', 'Delete', 'Create',