對于更精致的訪問控制,你可以在各個表上授權(quán),或甚至在表的每個列上。當你想向用戶隱藏一個表的部分時,或你想讓一個用戶只能修改特定的列時,列特定權(quán)限非常有用。如:
GRANT SELECT ON samp_db.member TO bill@localhost
INDETIFIED BY "rock"GRANT UPDATE (eXPiration) ON
第一條語句授予對整個member表的讀權(quán)限并設(shè)置了一個口令,第二條語句增加了UPDATE權(quán)限,當只對expiration列。沒必要再指定口令,因為第一條語句已經(jīng)指定了。
如果你想對多個列授予權(quán)限,指定一個用逗號分開的列表。例如,對assistant用戶增加member表的地址字段的UPDATE權(quán)限,使用如下語句,新權(quán)限將加到用戶已有的權(quán)限中:
GRANT UPDATE (street,city,state,zip) ON samp_db TO assistant@localhost。
通常,你不想授予任何比用戶確實需要的權(quán)限寬的權(quán)限。然而,當你想讓用戶能創(chuàng)建一個臨時表以保存中間結(jié)果,但你又不想讓他們在一個包含他們不應(yīng)修改內(nèi)容的數(shù)據(jù)庫中這樣做時,發(fā)生了要授予在一個數(shù)據(jù)庫上的相對寬松的權(quán)限。你可以通過建立一個分開的數(shù)據(jù)庫(如tmp)并授予開數(shù)據(jù)庫上的所有權(quán)限來進行。例如,如果你想讓來自mars.net域中主機的任何用戶使用tmp數(shù)據(jù)庫,你可以發(fā)出這樣的GRANT語句:GRANT ALL ON tmp.* TO ""@mars.net。
在你做完之后,用戶可以創(chuàng)建并用tmp.tbl_name形式引用tmp中的表(在用戶指定符中的""創(chuàng)建一個匿名用戶,任何用戶均匹配空白用戶名)。
用戶應(yīng)該被允許管理權(quán)限嗎?
第一步:
你可以允許一個數(shù)據(jù)庫的擁有者通過授予數(shù)據(jù)庫上的所有擁有者權(quán)限來控制數(shù)據(jù)庫的訪問,在授權(quán)時,指定WITH GRANT OPTION。例如:如果你想讓alicia能從big.corp.com域的任何主機連接并具有sales數(shù)據(jù)庫中所有表的管理員權(quán)限,你可以用如下GRANT語句:
GRANT ALL ON sales.* TO alicia@%.big.corp.com
INDETIFIED BY "applejuice" WITH GRANT OPTION
在效果上WITH GRANT OPTION子句允許你把訪問授權(quán)的權(quán)利授予另一個用戶。要注意,擁有GRANT權(quán)限的兩個用戶可以彼此授權(quán)。如果你只給予了第一個用戶SELECT權(quán)限,而另一個用戶有GRANT加上SELECT權(quán)限,那么第二個用戶可以是第一個用戶更“強大”。
第二步:
撤權(quán)并刪除用戶,要取消一個用戶的權(quán)限,使用REVOKE語句。REVOKE的語法非常類似于GRANT語句,除了TO用FROM取代并且沒有INDETIFED BY和WITH GRANT OPTION子句:
REVOKE privileges (columns) ON what FROM user
user部分必須匹配原來GRANT語句的你想撤權(quán)的用戶的user部分。privileges部分不需匹配,你可以用GRANT語句授權(quán),然后用REVOKE語句只撤銷部分權(quán)限。
REVOKE語句只刪除權(quán)限,而不刪除用戶。即使你撤銷了所有權(quán)限,在user表中的用戶記錄依然保留,這意味著用戶仍然可以連接服務(wù)器。要完全刪除一個用戶,你必須用一條DELETE語句明確從user表中刪除用戶記錄:
%mysql -u root mysqlmysql>DELETE FROM user
->WHERE User="user_name" and Host="host_name";
mysql>FLUSH PRIVILEGES;
DELETE語句刪除用戶記錄,而FLUSH語句告訴服務(wù)器重載授權(quán)表。(當你使用GRANT和REVOKE語句時,表自動重載,而你直接修改授權(quán)表時不是。)