Надайте ** всі ** пільги на базу даних


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'

10
Що ви отримуєте, коли показуєте ґРАНТИ ДЛЯ CURRENT_USER;
діагоналбатман

5
Ви пробували бігати FLUSH PRIVILEGES?
Ромен

1
@Andy Дякуємо за "ПОКАЗУЙТЕ ГРАНТИ ДЛЯ CURRENT_USER;" - це допомагає мені побачити свій друкарський помилок.
marioosh

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 дозволяє надати іншим користувачам або видалити з інших користувачів ті привілеї, якими ви самі володієте.

З міркувань безпеки не слід використовувати обліковий запис цього типу для жодного процесу, до якого громадськість матиме доступ (наприклад, веб-сайт). Рекомендується створити користувача з лише привілеями бази даних для такого типу використання.


35
@Залиця, ви насправді не приносите сюди багато таблиці - я не називаю своїх користувачів моїм користувачем - запитувач просто використовував ім'я користувача як приклад - я використовував той самий приклад ім'я користувача для послідовності.
diagonalbatman

22
Справедливо. Але потрібно також подумати про інших людей, можливо, про новачків, які могли б прийти прочитати це питання згодом. Чи не в цьому справа і так?
Ромен

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-vinebat.

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

Сподіваюсь, це допомагає.


26
+1 за не включення WITH GRANT OPTIONта націлювання на вказану базу даних замість усіх ( *).
Адоніс К. Какулідіс

@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/uk/grant.html

Якщо вам не комфортно з командним рядком, ви можете використовувати такий клієнт, як MySQL Workbench , Navicat або SQLyog


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 і виконайте команди, такі як операції створення, вибору та вставки.


Сьогодні це дало мені попередження "Використання оператора GRANT для зміни властивостей існуючого користувача, окрім привілеїв, застаріле і буде видалено у майбутньому випуску. Використовуйте ALTER USER для цієї операції." Тож чи варто розуміти, що я повинен створити користувача, а потім надати привілеї?
побачити

Як ви можете сказати MySQL, що usernameповинні бути всі привілеї, db_nameале не DROP db_name;привілей?
тонікс

21

Цей SQL надає всі бази даних, а лише основні привілеї. Їх вистачає для Drupal або Wordpress і, як вибагливість, дозволяє один обліковий запис розробника для місцевих проектів.

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, 
    INDEX, ALTER, CREATE TEMPORARY TABLES 
ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';

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;

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;

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';

The PRIVILEGESКлючове слово не потрібно.

Також не знаю, чому інші відповіді пропонують IDENTIFIED BY 'password'поставити в кінці команди. Я вважаю, що це не потрібно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.