MySQL資料庫許可權體系入門(3)---管理使用者許可權

junsansi發表於2010-09-29

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

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

檢視之前的連載:

MySQL資料庫許可權體系入門(2)---建立使用者

MySQL資料庫許可權體系入門(1)---工作原理

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-675079/,如需轉載,請註明出處,否則將追究法律責任。

相關文章