Search the MySQL manual:
MySQL Manual

Buy this Reference Manual in softcover from Barnes & Noble!

Previous / Next / Up / Table of Contents

4.3.1 Синтаксис команд GRANT и REVOKE

GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]
    ON {tbl_name | * | *.* | db_name.*}
    TO user_name [IDENTIFIED BY [PASSWORD] 'password']
        [, user_name [IDENTIFIED BY 'password'] ...]
    [REQUIRE
        [{SSL| X509}]
        [CIPHER cipher [AND]]
        [ISSUER issuer [AND]]
        [SUBJECT subject]]
    [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # |
                          MAX_UPDATES_PER_HOUR # |
                          MAX_CONNECTIONS_PER_HOUR #]]

REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...]
    ON {tbl_name | * | *.* | db_name.*}
    FROM user_name [, user_name ...]

GRANT включен в MySQL начиная с версии 3.22.11 и выше. В более ранних версиях MySQL оператор GRANT ничего не выполняет.

Команды GRANT и REVOKE позволяют системным администраторам создавать пользователей MySQL, а также предоставлять права пользователям или лишать их прав на четырех уровнях привилегий:

Глобальный уровень
Глобальные привилегии применяются ко всем базам данных на указанном сервере. Эти привилегии хранятся в таблице mysql.user.
Уровень базы данных
Привилегии базы данных применяются ко всем таблицам указанной базы данных. Эти привилегии хранятся в таблицах mysql.db и mysql.host.
Уровень таблицы
Привилегии таблицы применяются ко всем столбцам указанной таблицы. Эти привилегии хранятся в таблице mysql.tables_priv.
Уровень столбца
Привилегии столбца применяются к отдельным столбцам указанной таблицы. Эти привилегии хранятся в таблице mysql.columns_priv.

Если привилегии предоставляются пользователю, которого не существует, то этот пользователь создается. Чтобы просмотреть примеры работы команды GRANT, см. раздел section 4.3.5 Добавление новых пользователей в MySQL.

В таблице приведен список возможных значений параметра priv_type для операторов GRANT и REVOKE:

ALL [PRIVILEGES] Задает все простые привилегии, кроме WITH GRANT OPTION
ALTER Разрешает использование ALTER TABLE
CREATE Разрешает использование CREATE TABLE
CREATE TEMPORARY TABLES Разрешает использование CREATE TEMPORARY TABLE
DELETE Разрешает использование DELETE
DROP Разрешает использование DROP TABLE.
EXECUTE Разрешает пользователю запускать хранимые процедуры (для MySQL 5.0)
FILE Разрешает использование SELECT ... INTO OUTFILE и LOAD DATA INFILE.
INDEX Разрешает использование CREATE INDEX and DROP INDEX
INSERT Разрешает использование INSERT
LOCK TABLES Разрешает использование LOCK TABLES на таблицах, для которых есть привилегия SELECT.
PROCESS Разрешает использование SHOW FULL PROCESSLIST
REFERENCES Зарезервировано для использования в будущем
RELOAD Разрешает использование FLUSH
REPLICATION CLIENT Предоставляет пользователю право запрашивать местонахождение головного и подчиненных серверов.
REPLICATION SLAVE Необходимо для подчиненных серверов при репликации (для чтения информации из бинарных журналов головного сервера).
SELECT Разрешает использование SELECT
SHOW DATABASES SHOW DATABASES выводит все базы данных.
SHUTDOWN Разрешает использование mysqladmin shutdown
SUPER Позволяет установить одно соединение (один раз), даже если достигнуто значение max_connections, и запускать команды CHANGE MASTER, KILL thread, mysqladmin debug, PURGE MASTER LOGS и SET GLOBAL
UPDATE Разрешает использование UPDATE
USAGE Синоним для ``без привилегий''.

Значение USAGE можно задавать, если необходимо создать пользователя без привилегий.

Привилегии CREATE TEMPORARY TABLES, EXECUTE, LOCK TABLES, REPLICATION ..., SHOW DATABASES и SUPER являются новыми для версии 4.0.2. Чтобы воспользоваться этими новыми привилегиями после обновления до версии 4.0.2, необходимо запустить скрипт mysql_fix_privilege_tables.

В боле старых версиях MySQL привилегия PROCESS предоставляет такие же права, как и новая привилегия SUPER.

Чтобы лишить пользователя привилегий, предоставленных командой GRANT, воспользуйтесь значением priv_type в GRANT OPTION:

mysql> REVOKE GRANT OPTION ON ... FROM ...;

Для таблицы можно указать только следующие значения priv_type: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, INDEX и ALTER.

Для столбца можно указать только следующие значения priv_type (при использовании оператора column_list): SELECT, INSERT и UPDATE.

Глобальные привилегии можно задать, воспользовавшись синтаксисом ON *.*, а привилегии базы данных - при помощи синтаксиса ON db_name.*. Если указать ON * при открытой текущей базе данных, то привилегии будут заданы для этой базы данных. (Предупреждение: если указать ON * при отсутствии открытой текущей базы данных, это повлияет на глобальные привилегии!)

С тем, чтобы можно было определять права пользователям с конкретных компьютеров, в MySQL обеспечивается возможность указывать имя пользователя (user_name) в форме user@host. Если необходимо указать строку user, в которой содержатся специальные символы (такие как `-') или строку host, в которой содержатся специальные или групповые символы (такие как `%'), можно заключить имя удаленного компьютера или пользователя в кавычки (например, 'test-user'@'test-hostname').

В имени удаленного компьютера также можно указывать групповые символы. Например, user@"%.loc.gov" относится к user всех удаленных компьютеров домена loc.gov, а user@"144.155.166.%" относится к user всех удаленных компьютеров подсети 144.155.166 класс C.

Простая форма user является синонимом для user@"%".

В MySQL не поддерживаются групповые символы в именах пользователей. Анонимные пользователи определяются вставкой записей User='' в таблицу mysql.user или созданием пользователя с пустым именем при помощи команды GRANT.

Примечание: если анонимным пользователям разрешается подсоединяться к серверу MySQL, необходимо также предоставить привилегии всем локальным пользователям как user@localhost, поскольку в противном случае при попытке пользователя зайти в MySQL с локального компьютера в таблице mysql.user будет использоваться вход для анонимного пользователя!

Чтобы проверить, происходит ли подобное на вашем компьютере, выполните следующий запрос:

mysql> SELECT Host,User FROM mysql.user WHERE User='';

На данный момент команда GRANT поддерживает имена удаленных компьютеров, таблиц, баз данных и столбцов длиной не более 60 символов. Имя пользователя должно содержать не более 16 символов.

Привилегии для таблицы или столбца формируются при помощи логического оператора OR из привилегий каждого из четырех уровней. Например, если в таблице mysql.user указано, что у пользователя есть глобальная привилегия SELECT, эта привилегия не отменяется на уровне базы данных, таблицы или столбца.

Привилегии для столбца могут быть вычислены следующим образом:

глобальные привилегии
OR (привилегии базы данных AND привилегии удаленного компьютера)
OR привилегии таблицы
OR привилегии столбца

В большинстве случаев права пользователя определяются только на одном уровне привилегий, поэтому обычно эта процедура не настолько сложна, как описано выше. Подробная информация о последовательности действий проверки привилегий представлена в разделе section 4.2 Общие проблемы безопасности и система привилегий доступа MySQL.

Если привилегии предоставляются сочетанию пользователь/удаленный компьютер, которое отсутствует в таблице mysql.user, то в последнюю добавляется запись, которая остается в таблице до тех пор, пока не будет удалена при помощи команды DELETE. Иначе говоря, команда GRANT может создавать записи user в таблице, но команда REVOKE не может их удалить. Это необходимо делать при помощи команды DELETE.

Если в MySQL версий 3.22.12 и выше создан новый пользователь или предоставлены глобальные привилегии, пароль пользователя будет назначаться оператором IDENTIFIED BY, если он указан. Если у пользователя уже есть пароль, то этот пароль будет заменен новым.

Если вы не хотите отправлять пароль открытым текстом, можно воспользоваться параметром PASSWORD с зашифрованным паролем, полученным при помощи функции SQL PASSWORD() или функции C API make_scrambled_password(char *to, const char *password).

Предупреждение: если при создании нового пользователя не указать оператор IDENTIFIED BY, будет создан пользователь без пароля. Это ненадежно с точки зрения безопасности.

Пароли также можно задавать при помощи команды SET PASSWORD. See section 5.5.6 Синтаксис команды SET.

Если у вас привилегии для базы данных, то при необходимости в таблице mysql.db создается запись. Данная запись удаляется после удаления всех привилегий для этой базы данных командой REVOKE.

Если у пользователя нет никаких привилегий для таблицы, то таблица не отображается, когда пользователь запрашивает список таблиц (например, при помощи оператора SHOW TABLES).

Оператор WITH GRANT OPTION предоставляет пользователю возможность наделять других пользователей любыми привилегиями, которые он сам имеет на указанном уровне привилегий. При предоставлении привилегии GRANT необходимо проявлять осмотрительность, так как два пользователя с разными привилегиями могут объединить свои привилегии!

Параметры MAX_QUERIES_PER_HOUR #, MAX_UPDATES_PER_HOUR # и MAX_CONNECTIONS_PER_HOUR # являются новыми в MySQL версии 4.0.2. Эти параметры ограничивают количество запросов, обновлений и входов, которые пользователь может осуществить в течение одного часа. Если установлено значение 0 (принято по умолчанию), то это означает, что для данного пользователя нет ограничений. See section 4.3.6 Ограничение ресурсов пользователя.

Нельзя предоставить другому пользователю привилегию, которой нет у вас самого. Привилегия GRANT позволяет предоставлять только те привилегии, которыми вы обладаете.

Учтите, что если пользователю назначена привилегия GRANT на определенном уровне привилегий, то все привилегии, которыми этот пользователь уже обладает (или которые будут ему назначены в будущем!) на этом уровне, также могут назначаться этим пользователем. Предположим, пользователю назначена привилегия INSERT в базе данных. Если потом в базе данных назначить привилегию SELECT и указать WITH GRANT OPTION, пользователь сможет назначать не только привилегию SELECT, но также и INSERT. Если затем в базе данных предоставить пользователю привилегию UPDATE, пользователь сможет после этого назначать INSERT, SELECT и UPDATE.

Не следует назначать привилегии ALTER обычным пользователям. Это дает пользователю возможность разрушить систему привилегий путем переименования таблиц!

Обратите внимание на то, что если используются привилегии для таблицы или столбца даже для одного пользователя, сервер проверяет привилегии таблиц и столбцов для всех пользователей, и это несколько замедляет работу MySQL.

При запуске mysqld все привилегии считываются в память. Привилегии базы данных, таблицы и столбца вступают в силу немедленно, а привилегии уровня пользователя - при следующем подсоединении пользователя. Изменения в таблицах назначения привилегий, которые осуществляются при помощи команд GRANT и REVOKE, обрабатываются сервером немедленно. Если изменять таблицы назначения привилегий вручную (используя команды INSERT, UPDATE и т.д.), необходимо запустить оператор FLUSH PRIVILEGES или mysqladmin flush-privileges, чтобы указать серверу на необходимость перезагрузки таблиц назначения привилегий. See section 4.3.3 Когда изменения в привилегиях вступают в силу.

Наиболее значительные отличия команды GRANT версий ANSI SQL и MySQL следующие:

Чтобы ознакомиться с описанием использования REQUIRE, см. раздел See section 4.3.9 Использование безопасных соединений.

User Comments

Posted by on Saturday February 16 2002, @10:21pm [Delete] [Edit]

I had no problems with ld. DEC (Compaq) might
have fixed ld in a patch kit. You might want to
install the latest patch kit for your Digital Unix
(Tru64 Unix) before building MySQL. Patch kits
are available at
href=http://ftp.support.compaq.com/public/unix/>
http://ftp.support.compaq.com/public/unix/

Posted by on Saturday February 16 2002, @10:21pm [Delete] [Edit]

For source installations, these instructions refer to the directory structure presuming "usr/local" was used (default) with configure. But the preceding page's instructions (for compilation/installation) suggest you use:

./configure --prefix=/usr/local/mysql

To be consistent (and this is causing me some hassles with Perl, so it's not purely semantic), the instructions on this page should presume /usr/local/mysql was specified as the installation directory with configure.

Posted by on Saturday February 16 2002, @10:21pm [Delete] [Edit]

This is probably the most important and least
appreciated sections of all of the mySQL
documentation for first time mySQL users. IMHO,
reading this page in conjunction with
http://www.mysql.com/doc/P/r/Privileges.html is a
must for anyone planning secure database systems
of any real sophistication.

Posted by on Saturday February 16 2002, @10:21pm [Delete] [Edit]

I am trying to install MySQL under OS X Public Beta. When I run the mysql_install_db script, I get an error message:

dyld: ./bin/mysqld can't open library: /usr/lib/libpthread.A.dylib (No such file or directory, errno = 2)
Installation of grant tables failed!

I am assuming that the script is looking for a directory that doesn't exist because Apple has a little bit different directory naming structure. Maybe this script needs to be modified for the OS X distribution.

Can anyone help?

Posted by on Saturday February 16 2002, @10:21pm [Delete] [Edit]

It would be nice if there was an option to log connections, but not queries.

Posted by on Saturday February 16 2002, @10:21pm [Delete] [Edit]

If you're logged on as the mysql root user, without a current database selected, and you try to
grant all privileges to a user with the command:

GRANT ALL PRIVILEGES ON * TO bhaselto

then the RELOAD, SHUTDOWN, PROCESS, FILE and GRANT will not be granted, as can be
verified by checking the "user" table of the "mysql" database. (This is presumably by design,
since these privileges can make a user "too powerful".)

Posted by on Saturday February 16 2002, @10:21pm [Delete] [Edit]

NOTE: If you have granted privileges to a user on a particular database, or at any lower level than that, invoking "REVOKE ALL ON *.* FROM user@host;" will NOT revoke privileges at those levels. The *.* in the above statement means 'global', not 'all (individual) tables on all (individual) databases. That statment will ONLY revoke global privileges, as stored in the mysql.user table. You MUST revoke any more specific privileges in the same manner as they were granted, if you wish them to be removed from the privilege tables. (i.e. - GRANT ALL ON foo.* TO user@host; => REVOKE ALL ON foo.* FROM user@host;) I hope this saves some of you a little time and frustration.

Posted by Cris Perdue on Saturday February 16 2002, @10:21pm [Delete] [Edit]

REVOKE ALL on *.* from user@localhost does not revoke the privilege to connect to the database
server. To prohibit connections altogether it appears you have to use an SQL delete statement
then "flush privileges". This situation includes connection rights for the anonymous user
(""@localhost) automatically granted by some RPM distributions of MySQL. This usage of REVOKE
does remove all global privileges to do operations such as SELECT, INSERT, etc., leaving only the
privilege to connect.

Posted by on Saturday February 16 2002, @10:21pm [Delete] [Edit]

The documentation doesn't emphasize this point,
but it appears tables_priv doesn't allow CIDR
notation in the Host column. If you use CIDR
notation in the other privilege tables, you need
to use wildcard notation in tables_priv. This
also affects the way GRANT and REVOKE work: if you
grant table-specific privileges to a user using
CIDR notation, you'll need to manually adjust the
Host column in tables_priv.

Posted by Antonius Jacobs on Saturday February 16 2002, @10:21pm [Delete] [Edit]

I just chanced my password in mysql now I can't
login anymore. I have used the mysql usermanuel.
I hope someone can help my with this problem.

Posted by on Saturday February 16 2002, @10:21pm [Delete] [Edit]

To enable REPLACE command you have to set the
user DELETE privilegy!

Posted by William Janoch on Saturday February 16 2002, @10:21pm [Delete] [Edit]

For detailed exples of how to use GRANT, check out the GRANT OPTIONS section of the documentation.

Here's a pretty standard GRANT to give a use control of a whole (single) database:
GRANT ALL ON database.* TO user IDENTIFIED BY "password"

Posted by William Janoch on Wednesday December 18 2002, @5:27pm [Delete] [Edit]

Common General GRANT examples to give "user" total control of a single database:

from localhost:GRANT ALL ON database.* TO user@localhost IDENTIFIED BY "password"
from remote host: GRANT ALL ON database.* TO [email protected] IDENTIFIED BY "password"

Posted by on Saturday February 16 2002, @10:21pm [Delete] [Edit]

Don't forget to "flush privileges"! I just spent
a couple hours trying to figure out why I
couldn't load a file after granting the
appropriate permissions...

Posted by on Saturday February 16 2002, @10:21pm [Delete] [Edit]

!!! Process_priv=N does not generally mean NOT,

also:

4.5.6.6 SHOW PROCESSLIST
http://www.mysql.com/doc/S/H/SHOW_PROCESSLIST.html

"If you have the process privilege, you can see
all threads.
Otherwise, you can see only your own threads."

Posted by on Saturday February 16 2002, @10:21pm [Delete] [Edit]

You can use phpMyAdmin web based tool to do a lot
of mySQL admin functions. href="http://www.freebsdforums.org"
>FreeBSD forums

Posted by [name withheld] on Monday February 25 2002, @6:03am [Delete] [Edit]

Verified on MySQL 3.23.36 on Red Hat Linux 7.1:
Note that if you type
use a_c;
grant select on * to user@host;
you will have given user@host access to any
database matching 'a_c' where the underscore is a
wildcard. (Rarely a problem, I suppose).
Rectify with
update mysql.db set db='a\_c' where db='a_c';

Posted by jan behrens on Tuesday July 9 2002, @1:31am [Delete] [Edit]

the aformentioned bug from DAN ELIN in x.x.41 is
apperently still valid in x.x.51,i cannot logon to a
database after GRANTing privileges and given a
password to a new user(yes, i flushed
privileges)...................only root access is possible

Posted by Dan Egli on Thursday April 4 2002, @8:33pm [Delete] [Edit]

There seems to be a bug in 3.23.41 using Grant.
Only root can access the mysql database, even
after using Grant to grant privs on whatever
database/table/column/ect.. you always get
permission denied, regardless.

Posted by Lars Aronsson on Saturday June 8 2002, @11:16am [Delete] [Edit]

The normal response from a grant or revoke
statement is "Query OK, 0 rows affected". The
message that zero rows were affected is a common
source of confusion, but should just be ignored by
the user. Trying to revoke grants that were never
granted yields an "ERROR 1147: There is no such
grant defined for user...".

Posted by on Monday June 10 2002, @2:08pm [Delete] [Edit]

Where can I find information on how to revoke the
rights to 'show databases' command for ordinary
users? I don╢t want my users to know wich
databases exists on server...

Posted by Eric Anderson on Tuesday June 11 2002, @9:40am [Delete] [Edit]

I'm attempting to delete two users, one called
webmaster@"localhost" and the other
webmaster@"%". When I try to delete them I'm told
error: 1066: not unique table/alias and when I
try to specify by their ip mask I get a syntax
error. Any suggestions?

Posted by on Wednesday December 18 2002, @5:27pm [Delete] [Edit]

Eric Anderson wrote:
> I'm attempting to delete two users, one called webmaster@"localhost" and the other webmaster@"%".

Try this:
DELETE FROM user WHERE user='webmaster' AND host='localhost';
DELETE FROM user WHERE user='webmaster' AND host='%';
FLUSH PRIVILEGES;

Posted by Melvyn Sopacua on Monday August 19 2002, @5:15am [Delete] [Edit]

For 4.0.2, the privilege system has changed with
some backwards compatibility concerns, even when
the mysql_fix_privileges script has been run.

If you have a user, with all privileges for a
certian database, but no global privileges, the
CREATE TEMPORARY TABLE privilege on that database
is denied.

You have to give global CREATE __and__ global
CREATE TEMPORARY TABLES to the user. IOW:
GRANT CREATE, CREATE TEMPORARY TABLES ON *.* TO
user@host;

Needless to say, this affects security grately.

Posted by [name withheld] on Sunday August 25 2002, @9:17am [Delete] [Edit]

Temporary files are a great idea but even with
Create and Create Temproary File rights in the
user (global rights) file it still doesn't work.
This appears to be badly designed.

Posted by on Monday September 2 2002, @4:09am [Delete] [Edit]

It should be noted that WITH GRANT OPTION only
allows the user to pass on privileges to users who
already exist. The automagical creation of user
records does not apply - you get an error saying
that the user with the GRANT OPTION privilege does
not have access to the 'mysql' database. This is
probably a good thing, but it needs to be documented.

Posted by on Friday November 8 2002, @1:00pm [Delete] [Edit]

SHOW MASTER STATUS requires PROCESS privileges.
Other such odd combinations should be documented.

Posted by Dee Kintaudi on Thursday November 21 2002, @12:42pm [Delete] [Edit]

Okay I got a question and a problem with Mysql and
passwords:). I tried to use several of the options
and most of them have not worked. However one
soloution did work and I tested it out twice and it
was solid. Of course I lost the little piece of paper I
wrote it out on and I can't seem to find this
soloution anywhere, as if it did not exist or maybe I
imagined it. The soloution that worked for me,
before I lost the little slip of paper I wrote it down on
goes something like this..... Insert into user root
Password "my password" and then something
with 'Y', 'Y', 'Y', (about a dozen or 15 times or so)
However, I can not find this soloution anywhere can
someone help me out here?

I think it would be so nice if they just put this
throughout their documentation instead of trying to
hide it. I think this would solve many problems. Just
put password = 'Y', 'Y', 'Y', its like their ashamed of it
or something.

Posted by AJIT DIXIT on Monday November 25 2002, @6:56am [Delete] [Edit]

When I work on multi-table update with root user
it works fine

When I work with non-root user I get error

Sql : update Stockists, areas set a_nm = aname
where acd = area

Error : update command denied to user:
'aldixit@localhost' for table 'areas'

What previledges are required for multi-table update ?

Posted by on Friday February 21 2003, @5:21am [Delete] [Edit]

Version 3.23.38 for Windows: Hyphens in database names

If the database you are granting access to has a hyphen in the name, substitute the _ wildcard instead, for example:
if database name is called test-1:

GRANT Select, Insert, Update, Delete, Index, Alter, Create, Drop, References
ON test_1.*
TO 'user-1'@'%'
IDENTIFIED BY 'secret'

Add your own comment.

Top / Previous / Next / Up / Table of Contents