mysql 許可權表在資料庫啟動時載入記憶體,使用者通過身份認證後,系統會在記憶體中進行相應許可權的訪問。當 mysql 允許乙個使用者執行各種操作時,它將首先核實該使用者向 mysql 伺服器傳送的連線請求,然後確認使用者的操作請求是否被允許。
當使用者進行連線時,mysql 實現許可權控制主要有以下兩個階段:
登入 mysql 伺服器時,客戶端連線請求中會提供使用者名稱、主機位址和密碼,mysql 伺服器會使用 user 表中的 host、user 和 authentication_string (mysql 5.7 版本之前是 password)字段執行身份檢查。
只有客戶端請求的主機名和使用者名稱在 user 表中有匹配的記錄,並且密碼正確時,mysql 伺服器才會通過身份認證,接受連線,否則拒絕連線。
mysql 通過 ip 位址和使用者名稱聯合進行身份認證。例如 mysql 安裝後預設建立的使用者 root@localhost,表示使用者 root 只能從本地(localhost)進行連線時才能通過認證。此使用者從其它任何主機對資料庫進行連線時都將被拒絕。也就是說,使用者名稱相同,ip 位址不同,mysql 則將其視為不同的使用者。
伺服器接受連線後進入請求核實階段等待使用者請求。如果連線核實沒有通過,伺服器則完全拒絕訪問。
建立連線後,伺服器進入請求核實階段,對在此連線上的每個請求,伺服器都會檢查使用者是否有足夠的許可權來執行它。這正是授權表中的許可權列發揮作用的地方。
許可權按照以下許可權表的順序得到資料庫許可權:user→db→tables_priv→columns_priv→procs_priv。在這幾個許可權表中,許可權範圍依次遞減,全域性許可權覆蓋區域性許可權。
請求核實的過程如下所示:
1)使用者向 mysql 發出操作請求。
2)mysql 首先檢查 user 表,匹配 user、host 字段值,檢視請求的全域性許可權在 user 表中是否被授權。授權則允許操作執行,如果指定的許可權在 user 表中沒有被授權。mysql 將檢查 db 表。
3)db 表是下一安全層級,其中的許可權限定於資料庫層級,在該層級的 select 許可權允許使用者檢視指定資料庫的所有表中的資料。
mysql 檢查 db 許可權表中的許可權資訊,匹配 user、host 字段值,檢視請求的資料庫級別的許可權在 db 表中是否被授權。授權則允許操作執行,否則 mysql 繼續向下查詢。
4)mysql 檢查 tables_priv 許可權表中的許可權資訊,匹配 user、host 字段值,檢視請求的資料表級別的許可權在 tables_priv 表中是否被授權。授權則允許操作執行,否則 mysql 繼續向下查詢。
5)mysql 檢查 columns_priv 許可權表中的許可權資訊,匹配 user、host 字段值,檢視請求的列級別的許可權在 columns_priv 表中是否被授權。授權則允許操作執行,否則 mysql 繼續向下查詢。
10 MySQL入門小結
1.連線操作和集合操作 續 由於mysql不支援full join,我麼可以這樣實現 select from a left join b on a.id b.id union select from a right join b on a.id b.id a.先查出左聯接 b.查出右聯接 c.用un...
10 mysql選錯索引
在mysql表中可以支援多個索引,有的 sql不指定使用哪個索引,由 mysql 自己來決定,但是有時候 mysql 選錯了索引,導致執行很慢。例子create table t10 id int 11 not null a int 11 default null b int 11 default n...
10 mysql其它常用
1 檢視 開發中不常用 給某個常用的查詢語句設定別名,方便使用 建立 create view 檢視名稱 as sql 修改 alter view 檢視名稱 as sql 刪除 drop view 檢視名稱 檢視是虛擬的而非物理表。2 觸發器 開發中不常用 執行增刪改語句,自動執行設定的關聯語句 觸發...