Предоставить ** все ** привилегии для базы данных

611

Я создал базу данных, например «mydb».

CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_bin;
CREATE USER 'myuser'@'%' IDENTIFIED BY PASSWORD '*HASH';
GRANT ALL ON mydb.* TO 'myuser'@'%';
GRANT ALL ON mydb TO 'myuser'@'%';
GRANT CREATE ON mydb TO 'myuser'@'%';
FLUSH PRIVILEGES;

Теперь я могу войти в базу данных отовсюду, но не могу создавать таблицы.

Как предоставить все привилегии для этой базы данных и (в будущем) таблиц. Я не могу создавать таблицы в базе данных mydb. Я всегда получаю:

CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
ERROR 1142 (42000): CREATE command denied to user 'myuser'@'...' for table 't'
marioosh
источник
10
Что вы получаете, когда ПОКАЗЫВАЕТЕ ГРАНТЫ ДЛЯ CURRENT_USER;
diagonalbatman
5
Ты пробовал бегать FLUSH PRIVILEGES?
Ромен
1
@Andy Спасибо за "ПОКАЗАТЬ ГРАНТЫ ДЛЯ CURRENT_USER;" - это помогает мне увидеть мою опечатку.
Mariooosh
2
@Romain, flush privilegesне требуется при использовании grantкоманд. x4
Pacerier
2
Вы должны использовать FLUSH PRIVILEGES;только при изменении таблицы привилегий непосредственно используя операторы , такие как INSERT, UPDATEилиDELETE
simhumileco

Ответы:

910
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%' WITH GRANT OPTION;

Так я создаю свои привилегии «Суперпользователь» (хотя я обычно указываю хост).

ВАЖНАЯ ЗАМЕТКА

Хотя этот ответ может решить проблему доступа, WITH GRANT OPTIONсоздает пользователя MySQL, который может редактировать разрешения других пользователей .

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

По соображениям безопасности вы не должны использовать этот тип учетной записи пользователя для любого процесса, к которому у общественности будет доступ (например, к веб-сайту). Рекомендуется создать пользователя только с правами доступа к базе данных для этого вида использования.

diagonalbatman
источник
35
@ Оставайся, ты на самом деле не приносишь много в таблицу здесь - я не называю своих пользователей myuser - спрашивающий просто использовал имя пользователя в качестве примера - я использовал то же самое имя пользователя в качестве примера для согласованности.
diagonalbatman
22
Справедливо. Но нужно также подумать о других людях, возможно, новичках, которые могли бы прийти, чтобы прочитать этот вопрос позже. Разве это не так важно?
Romain
7
Я также не думаю, что этот ответ является хорошим. Он дает «администраторские» привилегии для всех баз данных и всех таблиц, а это не то, что было задано.
Дакс
5
Я отредактировал этот ответ, чтобы сказать mydb. * Вместо . Так как это очень широко обсуждаемый и часто обсуждаемый ответ, и я полагаю, что безопасность - особенно с отточенной какашкой, такой как MySQL, - чрезвычайно важна. Хотелось бы надеяться, что читатель будет исследовать детали ответа, а не копировать и вставлять, но мне иногда нравится жить в реальности.
Джордан,
4
@Romain Пользователи, настраивающие сервер MySQL, вероятно, достаточно умны, чтобы понять, что они должны заменить myuserсвое собственное имя пользователя.
AStopher
524

Это старый вопрос, но я не думаю, что принятый ответ является безопасным. Это хорошо для создания суперпользователя, но не хорошо, если вы хотите предоставить привилегии для одной базы данных.

grant all privileges on mydb.* to myuser@'%' identified by 'mypasswd';
grant all privileges on mydb.* to myuser@localhost identified by 'mypasswd';

%Кажется, не распространяется на сокет связи, что localhostдля. WITH GRANT OPTIONподходит только для суперпользователя, в противном случае это обычно угроза безопасности.

Обновление для MySQL 5.7+ выглядит следующим образом:

Использование оператора GRANT для изменения существующих свойств пользователя, отличных от привилегий, устарело и будет удалено в следующем выпуске. Используйте оператор ALTER USER для этой операции.

Так что установка пароля должна быть с отдельными командами. Спасибо за комментарий от @ scary-wombat.

ALTER USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
ALTER USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';

Надеюсь это поможет.

akostadinov
источник
26
+1 за отсутствие включения WITH GRANT OPTIONи нацеливание на указанную базу данных вместо all ( *).
Адонис К. Какоулидис
@IanBussieres не совсем понятна грамматика «% не распространяется на сокетные соединения, для которых предназначен localhost». Что это на самом деле означает?
Туфир
2
@Thufir, поиск unix sockets. При использовании localhostmyslq клиент на linux пытается использовать сокет unix вместо TCP-соединения с сервером.
Акостадинов
1
Обратите внимание, что вам, вероятно, не нужна первая команда, если вы не хотите получать доступ с внешних IP-адресов или с других компьютеров в локальной подсети. Если вы это сделаете, я бы рекомендовал использовать команды, нацеленные на конкретные IP-адреса, которые вы хотите разрешить, например myuser@192.168.0.1 (для одного в локальной подсети), а не myuser @% в целом.
Эван Донован
1
mysql> ALTER USER 'root' @ 'localhost' ИДЕНТИФИЦИРОВАНО 'new_password';
Страшный вомбат
121

Это будет полезно для некоторых людей:

Из командной строки MySQL:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';

К сожалению, на данный момент newuser не имеет права что-либо делать с базами данных. Фактически, если newuser даже попытается войти в систему (с помощью пароля и пароля), он не сможет получить доступ к оболочке MySQL.

Поэтому первое, что нужно сделать, - предоставить пользователю доступ к информации, которая ему потребуется.

GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';

Звездочки в этой команде относятся к базе данных и таблице (соответственно), к которым они имеют доступ - эта конкретная команда позволяет пользователю читать, редактировать, выполнять и выполнять все задачи во всех базах данных и таблицах.

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

FLUSH PRIVILEGES;

Ваши изменения вступят в силу.

За дополнительной информацией: http://dev.mysql.com/doc/refman/5.6/en/grant.html

Если вы не знакомы с командной строкой , то вы можете использовать клиент , как MySQL Workbench , Navicat или SQLyog

BrenBarn
источник
5
flush privilegesне требуется при использовании grantкоманд. x4
Pacerier
1
Либо вы оптовый скопирована из Linode, или они скопировали от вас: linode.com/docs/databases/mysql/...
Мне нужно было снова идентифицировать себя GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;(странно ..., но верно)
rubo77
30

 1. Создайте базу данных

CREATE DATABASE db_name;

 2. Создайте имя пользователя для базы данных db_name

GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'localhost' IDENTIFIED BY 'password';

 3. Используйте базу данных

USE db_name;

 4. Наконец, вы находитесь в базе данных db_name и затем выполняете команды, такие как операции создания, выбора и вставки.

Bhavnesh
источник
Сегодня это дало мне предупреждение: «Использование оператора GRANT для изменения свойств существующего пользователя, отличных от привилегий, устарело и будет удалено в следующем выпуске. Используйте оператор ALTER USER для этой операции». Так я должен понимать, что я должен создать пользователя, а затем предоставить привилегии, сейчас?
felwithe
Как вы можете сказать MySQL, что usernameвсе привилегии должны быть включены, db_nameно не DROP db_name;привилегии?
tonix
21

Этот SQL предоставляет все базы данных, но только основные привилегии. Их достаточно для Drupal или Wordpress и, как ни странно, позволяет создать одну учетную запись разработчика для локальных проектов.

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, 
    INDEX, ALTER, CREATE TEMPORARY TABLES 
ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';
s6712
источник
20
GRANT ALL PRIVILEGES ON mydb.* TO myuser@localhost IDENTIFIED BY 'mypasswd';

Работает для привилегий на схеме :)

Необязательно: после mypasswdтого, как вы можете добавитьWITH GRANT OPTION

Голландская слава
источник
15

Я мог бы заставить его работать только путем добавления GRANT OPTION, без этого всегда получаю ошибку «Отказано в доступе»

GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost' WITH GRANT OPTION;
GnanaPrakash
источник
14

Здравствуйте, я использовал этот код, чтобы иметь супер пользователя в MySQL

GRANT EXECUTE, PROCESS, SELECT, SHOW DATABASES, SHOW VIEW, ALTER, ALTER ROUTINE,
    CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP,
    EVENT, INDEX, INSERT, REFERENCES, TRIGGER, UPDATE, CREATE USER, FILE,
    LOCK TABLES, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHUTDOWN,
    SUPER
        ON *.* TO mysql@'%'
    WITH GRANT OPTION;

а потом

FLUSH PRIVILEGES;
gastonnina
источник
11
flush privilegesне требуется при использовании grantкоманд. x4
Pacerier
Примечание: точный список GRANTварьируется между версиями MySQL.
Рик Джеймс
6

Доступ только с удаленного сервера к базе данных mydb

GRANT ALL PRIVILEGES ON mydb.* TO 'root'@'192.168.2.21';

Доступ с удаленного сервера ко всем базам данных.

GRANT ALL PRIVILEGES ON * . * TO 'root'@'192.168.2.21';
разработчик
источник
4

Чтобы предоставить все привилегии в базе данных: mydbпользователю: myuserпросто выполните:

GRANT ALL ON mydb.* TO 'myuser'@'localhost';

или:

GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost';

PRIVILEGESКлючевое слово не нужно.

Также я не знаю, почему другие ответы предлагают IDENTIFIED BY 'password'поставить в конце команды. Я считаю, что это не требуется.

pgmank
источник