MySQL的Grant命令


與mysql 有關的博文還有

MySQL數據庫管理用戶權限

 

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中的操作權限 

ALTER Allows use of ALTER TABLE.
ALTER ROUTINE Alters or drops stored routines.
CREATE Allows use of CREATE TABLE.
CREATE ROUTINE Creates stored routines.
CREATE TEMPORARY TABLE Allows use of CREATE TEMPORARY TABLE.
CREATE USER Allows use of CREATE USERDROP USERRENAME USER, and REVOKE ALL PRIVILEGES.
CREATE VIEW Allows use of CREATE VIEW.
DELETE Allows use of DELETE.
DROP Allows use of DROP TABLE.
EXECUTE Allows the user to run stored routines.
FILE Allows use of SELECT..INTO OUTFILE and LOAD DATA INFILE.
INDEX Allows use of CREATE INDEX and DROP INDEX.
INSERT Allows use of INSERT.
LOCK TABLES Allows use of LOCK TABLES on tables for which the user also has SELECT privileges.
PROCESS Allows use of SHOW FULL PROCESSLIST.
RELOAD Allows use of FLUSH.
REPLICATION Allows the user to ask where slave or master
CLIENT servers are.
REPLICATION SLAVE Needed for replication slaves.
SELECT Allows use of SELECT.
SHOW DATABASES Allows use of SHOW DATABASES.
SHOW VIEW Allows use of SHOW CREATE VIEW.
SHUTDOWN Allows use of mysqladmin shutdown.
SUPER Allows use of CHANGE MASTERKILLPURGE MASTER LOGS, and SET GLOBAL SQL statements. Allows mysqladmin debug command. Allows one extra connection to be made if maximum connections are reached.
UPDATE Allows use of UPDATE.
USAGE Allows connection without any specific privileges.

   http://www.jb51.net/article/31850.htm

 

來源:http://yingxiong.javaeye.com/blog/451208

 

本文實例,運行於 MySQL 5.0 及以上版本。

MySQL 賦予用戶權限命令的簡單格式可概括為:

grant 權限 on 數據庫對象 to 用戶

 

 

 

一、grant 普通數據用戶,查詢、插入、更新、刪除 數據庫中所有表數據的權利。

grant select on testdb. * to common_user@ ' % '
grant insert on testdb. * to common_user@ ' % '
grant update on testdb. * to common_user@ ' % '
grant delete on testdb. * to common_user@ ' % '

或者,用一條 MySQL 命令來替代:

grant select , insert , update , delete on testdb. * to common_user@ ' % '

 

 

 

二、grant 數據庫開發人員,創建表、索引、視圖、存儲過程、函數。。。等權限。

grant 創建、修改、刪除 MySQL 數據表結構權限。

grant create on testdb. * to developer@ ' 192.168.0.% ' ;
grant alter on testdb. * to developer@ ' 192.168.0.% ' ;
grant drop on testdb. * to developer@ ' 192.168.0.% ' ;

 

grant 操作 MySQL 外鍵權限。

grant references on testdb. * to developer@ ' 192.168.0.% ' ;

 

grant 操作 MySQL 臨時表權限。

grant create temporary tables on testdb. * to developer@ ' 192.168.0.% ' ;

 

grant 操作 MySQL 索引權限。

grant index on testdb. * to developer@ ' 192.168.0.% ' ;

 

grant 操作 MySQL 視圖、查看視圖源代碼 權限。

grant create view on testdb. * to developer@ ' 192.168.0.% ' ;
grant show view on testdb. * to developer@ ' 192.168.0.% ' ;

 

grant 操作 MySQL 存儲過程、函數 權限。

grant create routine on testdb. * to developer@ ' 192.168.0.% ' ; -- now, can show procedure status
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 數據庫的權限。

grant all privileges on testdb to dba@ ' localhost '

其中,關鍵字 “privileges” 可以省略。

 

 


四、grant 高級 DBA 管理 MySQL 中所有數據庫的權限。

grant all on * . * to dba@ ' localhost '

 

 

 

五、MySQL grant 權限,分別可以作用在多個層次上。

1. grant 作用在整個 MySQL 服務器上:

grant select on * . * to dba @localhost ; -- dba 可以查詢 MySQL 中所有數據庫中的表。
grant all on * . * to dba @localhost ; -- dba 可以管理 MySQL 中的所有數據庫

 

2. grant 作用在單個數據庫上:

grant select on testdb. * to dba @localhost ; -- dba 可以查詢 testdb 中的表。

 

3. grant 作用在單個數據表上:

grant select , insert , update , delete on testdb.orders to dba @localhost ;

 

這里在給一個用戶授權多張表時,可以多次執行以上語句。例如:

grant select ( user_id ,username) on smp.users to mo_user@ ' % ' identified by ' 123345 ' ;
grant select on smp.mo_sms to mo_user@ ' % ' identified by ' 123345 ' ;


4. grant 作用在表中的列上:

grant select (id, se, rank) on testdb.apache_log to dba @localhost ;

 

5. grant 作用在存儲過程、函數上:

grant execute on procedure testdb.pr_add to ' dba ' @ ' localhost '
grant execute on function testdb.fn_add to ' dba ' @ ' localhost '

 

 

 

六、查看 MySQL 用戶權限

查看當前用戶(自己)權限:

show grants;

 

查看其他 MySQL 用戶權限:

show grants for dba @localhost ;

 

 

 

七、撤銷已經賦予給 MySQL 用戶權限的權限。

revoke 跟 grant 的語法差不多,只需要把關鍵字 “to” 換成 “from” 即可:

grant all on * . * to dba @localhost ;
revoke all on * . * from dba @localhost ;

 

 

 

八、MySQL grant、revoke 用戶權限注意事項

1. grant, revoke 用戶權限后,該用戶只有重新連接 MySQL 數據庫,權限才能生效。

2. 如果想讓授權的用戶,也可以將這些權限 grant 給其他用戶,需要選項 “grant option“

grant select on testdb. * to dba @localhost with 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

      | 
MAX_USER_CONNECTIONS 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不會自動中止已連接的用戶會話,也就是說被刪的用戶如果在刪前已經連接上了服務器,並且沒有尚未中斷,那它此時還能繼續執行一定的操作,只是,它的身份已經變成了黑戶。

 

=======================================


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM