與mysql 有關的博文還有
一, 創建用戶:
命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password';
說明:username - 你將創建的用戶名, host - 指定該用戶在哪個主機上可以登陸,如果是本地用戶可用localhost, 如果想讓該用戶可以從任意遠程主機登陸,可以使用通配符%. password - 該用戶的登陸密碼,密碼可以為空,如果為空則該用戶可以不需要密碼登陸服務器.
例子: CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY '123456';
CREATE USER 'pig'@'%' IDENTIFIED BY '123456';
CREATE USER 'pig'@'%' IDENTIFIED BY '';
CREATE USER 'pig'@'%';
二,授權:
命令:GRANT privileges ON databasename.tablename TO 'username'@'host'
說明: privileges - 用戶的操作權限,如SELECT , INSERT , UPDATE 等(詳細列表見該文最后面).如果要授予所的權限則使用ALL.;databasename - 數據庫名,tablename-表名,如果要授予該用戶對所有數據庫和表的相應操作權限則可用*表示, 如*.*.
例子: GRANT SELECT, INSERT ON test.user TO 'pig'@'%';
GRANT ALL ON *.* TO 'pig'@'%';
注意:用以上命令授權的用戶不能給其它用戶授權,如果想讓該用戶可以授權,用以下命令:
GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;
三.設置與更改用戶密碼
命令:SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword');如果是當前登陸用戶用SET PASSWORD = PASSWORD("newpassword");
例子: SET PASSWORD FOR 'pig'@'%' = PASSWORD("123456");
四.撤銷用戶權限
命令: REVOKE privilege ON databasename.tablename FROM 'username'@'host';
說明: privilege, databasename, tablename - 同授權部分.
例子: REVOKE SELECT ON *.* FROM 'pig'@'%';
注意: 假如你在給用戶'pig'@'%'授權的時候是這樣的(或類似的):GRANT SELECT ON test.user TO 'pig'@'%', 則在使用REVOKE SELECT ON *.* FROM 'pig'@'%';命令並不能撤銷該用戶對test數據庫中user表的SELECT 操作.相反,如果授權使用的是GRANT SELECT ON *.* TO 'pig'@'%';則REVOKE SELECT ON test.user FROM 'pig'@'%';命令也不能撤銷該用戶對test數據庫中user表的Select 權限.
具體信息可以用命令SHOW GRANTS FOR 'pig'@'%'; 查看.
五.刪除用戶
命令: DROP USER 'username'@'host';
附表:在MySQL中的操作權限
http://www.jb51.net/article/31850.htm
來源:http://yingxiong.javaeye.com/blog/451208
本文實例,運行於 MySQL 5.0 及以上版本。
MySQL 賦予用戶權限命令的簡單格式可概括為:
一、grant 普通數據用戶,查詢、插入、更新、刪除 數據庫中所有表數據的權利。
grant insert on testdb. * to common_user@ ' % '
grant update on testdb. * to common_user@ ' % '
grant delete on testdb. * to common_user@ ' % '
或者,用一條 MySQL 命令來替代:
二、grant 數據庫開發人員,創建表、索引、視圖、存儲過程、函數。。。等權限。
grant 創建、修改、刪除 MySQL 數據表結構權限。
grant alter on testdb. * to developer@ ' 192.168.0.% ' ;
grant drop on testdb. * to developer@ ' 192.168.0.% ' ;
grant 操作 MySQL 外鍵權限。
grant 操作 MySQL 臨時表權限。
grant 操作 MySQL 索引權限。
grant 操作 MySQL 視圖、查看視圖源代碼 權限。
grant show view on testdb. * to developer@ ' 192.168.0.% ' ;
grant 操作 MySQL 存儲過程、函數 權限。
grant alter routine on testdb. * to developer@ ' 192.168.0.% ' ; -- now, you can drop a procedure
grant execute on testdb. * to developer@ ' 192.168.0.% ' ;
三、grant 普通 DBA 管理某個 MySQL 數據庫的權限。
其中,關鍵字 “privileges” 可以省略。
四、grant 高級 DBA 管理 MySQL 中所有數據庫的權限。
五、MySQL grant 權限,分別可以作用在多個層次上。
1. grant 作用在整個 MySQL 服務器上:
grant all on * . * to dba @localhost ; -- dba 可以管理 MySQL 中的所有數據庫
2. grant 作用在單個數據庫上:
3. grant 作用在單個數據表上:
這里在給一個用戶授權多張表時,可以多次執行以上語句。例如:
grant select on smp.mo_sms to mo_user@ ' % ' identified by ' 123345 ' ;
4. grant 作用在表中的列上:
5. grant 作用在存儲過程、函數上:
grant execute on function testdb.fn_add to ' dba ' @ ' localhost '
六、查看 MySQL 用戶權限
查看當前用戶(自己)權限:
查看其他 MySQL 用戶權限:
七、撤銷已經賦予給 MySQL 用戶權限的權限。
revoke 跟 grant 的語法差不多,只需要把關鍵字 “to” 換成 “from” 即可:
revoke all on * . * from dba @localhost ;
八、MySQL grant、revoke 用戶權限注意事項
1. grant, revoke 用戶權限后,該用戶只有重新連接 MySQL 數據庫,權限才能生效。
2. 如果想讓授權的用戶,也可以將這些權限 grant 給其他用戶,需要選項 “grant option“
這個特性一般用不到。實際中,數據庫權限最好由 DBA 來統一管理。
*************************************************************************************************
遇到 SELECT command denied to user '用戶名'@'主機名' for table '表名' 這種錯誤,解決方法是需要把吧后面的表名授權,即是要你授權核心數據庫也要。
我遇到的是SELECT command denied to user 'my'@'%' for table 'proc',是調用存儲過程的時候出現,原以為只要把指定的數據庫授權就行了,什么存儲過程、函數等都不用再管了,誰知道也要把數據庫mysql的proc表授權
*************************************************************************************************
參考:http://zhidao.baidu.com/question/19633785.html
mysql授權表共有5個表:user、db、host、tables_priv和columns_priv。
授權表的內容有如下用途:
user表
user表列出可以連接服務器的用戶及其口令,並且它指定他們有哪種全局(超級用戶)權限。在user表啟用的任何權限均是全局權限,並適用於所有數據庫。例如,如果你啟用了DELETE權限,在這里列出的用戶可以從任何表中刪除記錄,所以在你這樣做之前要認真考慮。
db表
db表列出數據庫,而用戶有權限訪問它們。在這里指定的權限適用於一個數據庫中的所有表。
host表
host表與db表結合使用在一個較好層次上控制特定主機對數據庫的訪問權限,這可能比單獨使用db好些。這個表不受GRANT和REVOKE語句的影響,所以,你可能發覺你根本不是用它。
tables_priv表
tables_priv表指定表級權限,在這里指定的一個權限適用於一個表的所有列。
columns_priv表
columns_priv表指定列級權限。這里指定的權限適用於一個表的特定列。
http://blog.itpub.net/7607759/viewspace-675079/
2.2 授予權限
前面提到了grant命令,grant的語法看起來可是相當復雜的吶:
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
[WITH with_option ...]
加粗的幾個子項說明如下:
l object_type:
TABLE
| FUNCTION
| PROCEDURE
l priv_level:
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
l ssl_option:
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
l with_option:
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
-
|
priv_type最簡單,但可選項最多,官方文檔中專門列了個表很清晰:
| 權限類型 |
簡要說明 |
| ALL [PRIVILEGES] |
Grant all privileges at specified access level except GRANT OPTION |
| ALTER |
Enable use of ALTER TABLE |
| ALTER ROUTINE |
Enable stored routines to be altered or dropped |
| CREATE |
Enable database and table creation |
| CREATE ROUTINE |
Enable stored routine creation |
| CREATE TEMPORARY TABLES |
Enable use of CREATE TEMPORARY TABLE |
| CREATE USER |
Enable use of CREATE USER, DROP USER, RENAME USER, and REVOKE ALL PRIVILEGES |
| CREATE VIEW |
Enable views to be created or altered |
| DELETE |
Enable use of DELETE |
| DROP |
Enable databases, tables, and views to be dropped |
| EVENT |
Enable use of events for the Event Scheduler |
| EXECUTE |
Enable the user to execute stored routines |
| FILE |
Enable the user to cause the server to read or write files |
| GRANT OPTION |
Enable privileges to be granted to or removed from other accounts |
| INDEX |
Enable indexes to be created or dropped |
| INSERT |
Enable use of INSERT |
| LOCK TABLES |
Enable use of LOCK TABLES on tables for which you have the SELECT privilege |
| PROCESS |
Enable the user to see all processes with SHOW PROCESSLIST |
| REFERENCES |
Not implemented |
| RELOAD |
Enable use of FLUSH operations |
| REPLICATION CLIENT |
Enable the user to ask where master or slave servers are |
| REPLICATION SLAVE |
Enable replication slaves to read binary log events from the master |
| SELECT |
Enable use of SELECT |
| SHOW DATABASES |
Enable SHOW DATABASES to show all databases |
| SHOW VIEW |
Enable use of SHOW CREATE VIEW |
| SHUTDOWN |
Enable use of mysqladmin shutdown |
| SUPER |
Enable use of other adminstrative operations such as CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBAL, and mysqladmin debug command |
| TRIGGER |
Enable triggers to be created or dropped |
| UPDATE |
Enable use of UPDATE |
| USAGE |
Synonym for “no privileges |
括弧,權限說明的英文語法很簡單,俺偷個懶,就不譯成中文的。
以上幾段加一塊基本上就是grant語句的語法,看起來呢是復雜了一點點,不過看不懂沒關系,再說就算看懂了也不一定記的住,就像現在人人都知道要先感謝國家,但是人人也都明白不過說說而已(不過百萬裸官在海外的親戚們說這話時應該是真心的),關鍵還是得動真格的,得會用才行,三思爭取后面多弄幾個例子,讓大家伙都搞明白這個事兒。
提示:
-
不使用grant語句,而通過insert,update方式修改字典表也是靠譜的!
重點說一下with_option的幾個選項:
- GRANT OPTION:允許用戶再將該權限授予其它用戶;
- MAX_QUERIES_PER_HOUR:允許用戶每小時執行的查詢語句數量;
- MAX_UPDATES_PER_HOUR:允許用戶每小時執行的更新語句數量;
- MAX_CONNECTIONS_PER_HOUR:允許用戶每小時連接的次數;
- MAX_USER_CONNECTIONS:允許用戶同時連接服務器的數量;
這塊的內容一看就是給用戶設限制使的,我個人認為意義不大,不過簡單了解一下也是有必要的,萬一哪天對某用戶看着不爽,DBA心里應該明白,還是有法子限制該用戶能夠使用的資源的。
其它部分就先不多說了,何況這個事兒也不能說的太細,主要是太細的東西三思也不懂,不懂裝懂這個事兒俺臉皮雖然已經很厚,但做這類事兒的時候表情總是不夠自然,不過請童鞋們放心,俺一定會繼續努力,爭取早日成功復制那誰的成功,用俺的真誠蒙到別人,蒙到所有的人~~~
2.3 收回權限
要收回用戶權限,與之對應的命令是revoke,它的語法從定義上分為兩種:
- REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ...
- REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
前者用來處理指定的權限,后者去掉所有權限。Revoke語法的子句定義與grant中同名子句定義一模一樣,這里不再復述。
如果想確定用戶當前都擁有什么權限,可以使用show grants語句,例如,查看用戶jss_grant@10.0.0.99都擁有哪些權限,執行語句如下:
mysql> show grants for jss_grant@10.0.0.99;
+------------------------------------------------------------------------------------------------------------------+
| Grants for jss_grant@10.0.0.99 |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'jss_grant'@'10.0.0.99' IDENTIFIED BY PASSWORD '*284578888014774CC4EF4C5C292F694CEDBB5457' |
| GRANT SELECT ON `mysql`.`user` TO 'jss_grant'@'10.0.0.99' |
+------------------------------------------------------------------------------------------------------------------+
-
2 rows in set (0.00 sec)
從上述返回的結果可以看到,用戶jss_grant@10.0.0.99擁有兩個權限,查詢mysql.user表的查詢,以及登錄MySQL數據庫的權限。一般用戶只要創建,就會擁有usage on *.*的權限,該權限無法通過revoke語句收回,切記切記。
嘗試,收回jss_grant用戶對mysql.user的select權限,操作如下:
mysql> revoke select on mysql.user from jss_grant@10.0.0.99;
-
Query OK, 0 rows affected (0.00 sec)
2.4 刪除用戶
刪除用戶的語法非常簡單:
-
DROP USER user [, user] ...
從語法上看與ORACLE有一點點不同,這個我感覺還是有必要提一下,比如ORACLE中的刪除用戶(或其它對象比如表空間),如果該用戶下有別的對象,那么默認刪除操作會失敗,ORACLE提示需要先清理一下該用戶下的對象,如果強制刪除的話呢,它提供了一個CASCADE子句,附加該子句后就不再提示,即使存在關聯對象也將自動將其刪除。
MySQL的刪除用戶語法中就不存在CASCADE的子句,為什么不存在呢,並不是MySQL對數據的保護不如ORACLE那么上心,而是由於最重要的一條與ORACLE不同的機制決定,MySQL數據庫中的對象保存並不是依賴於用戶,而是依賴於庫(db),用戶被刪除沒有任何關系,對象仍在,好好的保存在其所存儲的數據庫中,因此,MySQL數據庫中的用戶刪了就刪了,如果外部應用不使用該用戶的話,那么我們可以認為該用戶被刪除無影響。即使發現真的刪錯了,該用戶其實早就立志將一生奉獻給鐮刀斧頭幫,並且作風過硬,對party和國家無限忠誠,party讓咬誰就咬誰。想給它恢復身份的話也很簡單,這不就是組織上一句話的事兒嘛,只要重新向mysql.user表重新插入記錄(注冊建檔),並授予所需權限即可(授予官階),至於底層數據的意見那是完全可以忽視的。
提示:
-
DROP USER不會自動中止已連接的用戶會話,也就是說被刪的用戶如果在刪前已經連接上了服務器,並且沒有尚未中斷,那它此時還能繼續執行一定的操作,只是,它的身份已經變成了黑戶。
=======================================
