MySQL有一套先進的但非標准的安全/授權系統,掌握其授權機制是開始操作MySQL數據庫必須要走的第一步,對於一個熟悉SQL基本操作的人來說,也是MySQL所有的知識中比較難以理解的一個部分。本節通過揭開其授權系統的運作機制,希望大家能夠可以更好地操作和使用這個優秀的數據庫系統。
MySQL的安全系統是很靈活的,它允許你以多種不同方式設置用戶權限。一般地,你可使用標准的SQL語句GRANT和REVOKE語句做,他們為你修改控制客戶訪問的授權表,然而,你可能由一個不支持這些語句的老版本的MySQL在3.22.11之前這些語句不起作用),或者你發覺用戶權限看起來不是以你想要的方式工作。對於這種情況,了解MySQL授權表的結構和服務器如何利用它們決定訪問權限是有幫助的,這樣的了解允許你通過直接修改授權表增加、刪除或修改用戶權限,它也允許你在檢查這些表時診斷權限問題。
MySQL授權表的結構
通過網絡連接服務器的客戶對MySQL數據庫的訪問由授權表內容來控制。這些表位於mysql數據庫中,並在第一次安裝MySQL的過程中初始化運行mysql_install_db腳本)。授權表共有5個表:user、db、host、tables_priv和columns_priv。
授權表user、db和host的結構和作用
表1 授權表user、db和host的結構
授權表的內容有如下用途:
·user表
user表列出可以連接服務器的用戶及其口令,並且它指定他們有哪種全局超級用戶)權限。在user表啟用的任何權限均是全局權限,並適用於所有數據庫。例如,如果你啟用了DELETE權限,在這裡列出的用戶可以從任何表中刪除記錄,所以在你這樣做之前要認真考慮。
·db表
db表列出數據庫,而用戶有權限訪問它們。在這裡指定的權限適用於一個數據庫中的所有表。
·host表
host表與db表結合使用在一個較好層次上控制特定主機對數據庫的訪問權限,這可能比單獨使用db好些。這個表不受GRANT和REVOKE語句的影響,所以,你可能發覺你根本不是用它。
授權表tables_priv和columns_priv的結構和作用
表2 授權表tables_priv和columns_priv的結構
授權表tables_priv
授權表columns_priv
作用域列
Host
Host
Db
Db
User
User
Table_name
Table_name
Column_name
權限列
Table_priv
Column_priv
其他列
Timestamp
Timestamp
Grantor
MySQL沒有rows_priv表,因為它不提供記錄級權限,例如,你不能限制用戶於表中包含特定列值的行。如果你確實需要這種能力,你必須用應用編程來提供。如果你想執行建議的記錄級鎖定,你可用GET_LOCK()函數做到。
授權表的內容有如下用途:
·tables_priv表
tables_priv表指定表級權限,在這裡指定的一個權限適用於一個表的所有列。
·columns_priv表
columns_priv表指定列級權限。這裡指定的權限適用於一個表的特定列。
tables_priv和columns_priv表在MySQL 3.22.11版引進與GRANT語句同時)。如果你有較早版本的MySQL,你的mysql數據庫將只有user、db和host表。如果你從老版本升級到3.22.11或更新,而沒有tables_priv和columns_priv表,運行mysql_fix_privileges_tables腳本創建它們。
用戶的權限
權限信息用user、db、host、tables_priv和columns_priv表被存儲在mysql數據庫中(即在名為mysql的數據庫中)。在MySQL啟動時和在7.5權限修改何時生效所說的情況時,服務器讀入這些數據庫表內容。
數據庫和表的權限
下列權限運用於數據庫和表上的操作。
·SELECT
允許你使用SELECT語句從表中檢索數據。SELECT語句只有在他們真正從一個表中檢索行是才需要select權限,你可以執行某個SELECT語句,甚至沒有任何到服務器上的數據庫裡的存取任何東西的許可。例如,你可使用mysql客戶作為一個簡單的計算器:
mysql> SELECT 1+1;
mysql> SELECT PI()*2;
·UPDATE
允許你修改表中的已有的記錄。
·INSERT
允許在表中插入記錄
·DELETE
允許你從表中刪除現有記錄。
·ALTER
允許你使用ALTER TABLE語句,這其實是一個簡單的第一級權限,你必須由其他權限,這看你想對數據庫實施什麼操作。
·CREATE
允許你創建數據庫和表,但不允許創建索引。
·DROP
允許你刪除拋棄)數據庫和表,但不允許刪除索引。
注意:如果你將mysql數據庫的drop權限授予一個用戶,該用戶能拋棄存儲了MySQL存取權限的數據庫!
·INDEX
允許你創建並刪除索引。
·REFERENCES
目前不用。