在伺服器接受連線之後,它會進入存取控制的階段 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
表格列特別授與相關資料庫的另一個權限。在這種情況下,您有執行請求所需的必要權限,但伺服器無法單獨從您的全域或資料庫權限中判斷出來。它必須根據組合權限做出存取控制決策。