在伺服器接受連線之後,它會進入存取控制的階段 2。對於您透過連線發出的每個請求,伺服器會判斷您想要執行的操作,然後檢查您的權限是否足夠。這就是授權表中權限欄發揮作用的地方。這些權限可以來自 user、global_grants、db、tables_priv、columns_priv 或 procs_priv 表格中的任何一個。(您可能會發現參考第 8.2.3 節,「授權表」很有幫助,其中列出了每個授權表中存在的欄。)
user 和 global_grants 表格授予全域權限。這些表格中指定帳戶的列會指出無論預設資料庫為何,全域適用的帳戶權限。例如,如果 user 表格授予您 DELETE 權限,您就可以從伺服器主機上任何資料庫的任何表格中刪除列。明智的做法是只在 user 表格中授予需要權限的人,例如資料庫管理員。對於其他使用者,請將 user 表格中的所有權限保留設定為 'N',並且僅在更特定的層級(針對特定資料庫、表格、欄或常式)授予權限。也可以全域授予資料庫權限,但使用部分撤銷來限制在特定資料庫上執行它們(請參閱第 8.2.12 節,「使用部分撤銷限制權限」)。
db 表格授予資料庫特定的權限。此表格中範圍欄的值可以採用下列形式
伺服器會在讀取 user 表格的同時,將 db 表格讀入記憶體並進行排序。伺服器會根據 Host、Db 和 User 範圍欄位對 db 表格進行排序。如同 user 表格一樣,排序會將最明確的值放在最前面,最不明確的值放在最後面,而且當伺服器尋找符合的列時,它會使用找到的第一個符合項目。
tables_priv、columns_priv 和 procs_priv 表格會授與特定表格、特定欄位和特定常式的權限。這些表格範圍欄位中的值可以採用以下形式:
萬用字元
%和_可在Host欄位中使用。它們的意義與使用LIKE運算子進行模式比對操作時相同。'%'或空白的Host值表示 “任何主機。”Db、Table_name、Column_name和Routine_name欄位不能包含萬用字元或空白。
伺服器會根據 Host、Db 和 User 欄位對 tables_priv、columns_priv 和 procs_priv 表格進行排序。這與 db 表格的排序方式相似,但更簡單,因為只有 Host 欄位可以包含萬用字元。
伺服器會使用排序後的表格來驗證接收到的每個請求。對於需要管理權限的請求,例如 SHUTDOWN 或 RELOAD,伺服器只會檢查 user 和 global_privilege 表格,因為這些表格是唯一指定管理權限的表格。如果這些表格中帳戶的列允許請求的操作,則伺服器會授與存取權,否則會拒絕存取權。例如,如果您想要執行 mysqladmin shutdown,但您的 user 表格列沒有授與您 SHUTDOWN 權限,則伺服器會拒絕存取權,甚至不會檢查 db 表格。(後者表格不包含 Shutdown_priv 欄位,因此不需要檢查它。)
對於與資料庫相關的請求(INSERT、UPDATE 等),伺服器會先檢查使用者在 user 表格列中的全域權限(減去部分撤銷所施加的任何權限限制)。如果該列允許請求的操作,則會授予存取權。如果 user 表格中的全域權限不足,則伺服器會從 db 表格判斷使用者的資料庫特定權限。
伺服器會在
db表格中尋找Host、Db和User欄位的相符項目。Host和User欄位會與連線使用者的主機名稱和 MySQL 使用者名稱比對。Db欄位會與使用者想要存取的資料庫比對。如果沒有
Host和User的列,則會拒絕存取權。
在判斷 db 表格列授予的資料庫特定權限之後,伺服器會將它們新增至 user 表格授予的全域權限。如果結果允許請求的操作,則會授予存取權。否則,伺服器會依序檢查使用者在 tables_priv 和 columns_priv 表格中的表格和欄位權限,將這些權限新增至使用者的權限,並根據結果允許或拒絕存取權。對於儲存常式操作,伺服器會使用 procs_priv 表格,而不是 tables_priv 和 columns_priv。
用布林術語表示,上述使用者權限的計算方式可以總結如下:
global privileges
OR database privileges
OR table privileges
OR column privileges
OR routine privileges如果最初發現全域權限不足以執行請求的操作,為什麼伺服器稍後會將這些權限新增至資料庫、表格和欄位權限,這可能不明顯。原因是請求可能需要一種以上的權限類型。例如,如果您執行 INSERT INTO ... SELECT 陳述式,您需要 INSERT 和 SELECT 權限。您的權限可能是 user 表格列授與一個全域權限,而 db 表格列特別授與相關資料庫的另一個權限。在這種情況下,您有執行請求所需的必要權限,但伺服器無法單獨從您的全域或資料庫權限中判斷出來。它必須根據組合權限做出存取控制決策。