Przyznaj ** wszystkie ** uprawnienia do bazy danych

611

Stworzyłem bazę danych, na przykład „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;

Teraz mogę zalogować się do bazy danych z dowolnego miejsca, ale nie mogę tworzyć tabel.

Jak przyznać wszystkie uprawnienia do tej bazy danych i (w przyszłości) tabel. Nie mogę tworzyć tabel w bazie danych „mydb”. Zawsze dostaję:

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
źródło
10
Co otrzymujesz, gdy POKAŻ DOTACJE NA AKTUALNY UŻYTKOWNIK;
diagonalbatman
5
Próbowałeś biegać FLUSH PRIVILEGES?
Romain
1
@Dziękuję, dziękuję za „POKAŻ DOTACJE NA BIEŻĄCY;” - to pomaga mi zobaczyć moją literówkę.
marioosh
2
@Romain, flush privilegesnie jest potrzebny, gdy używasz grantpoleceń. x4
Pacerier
2
Należy używać FLUSH PRIVILEGES;tylko jeśli modyfikować tabele dotacje bezpośrednio za pomocą oświadczenia, takie jak INSERT, UPDATElubDELETE
simhumileco

Odpowiedzi:

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

W ten sposób tworzę uprawnienia „superużytkownika” (chociaż normalnie określałbym hosta).

WAŻNA UWAGA

Chociaż ta odpowiedź może rozwiązać problem z dostępem, WITH GRANT OPTIONtworzy użytkownika MySQL, który może edytować uprawnienia innych użytkowników .

Przywilej GRANT OPTION umożliwia nadanie innym użytkownikom lub usunięcie z nich tych uprawnień, które sam posiadasz.

Ze względów bezpieczeństwa nie należy używać tego typu konta użytkownika w jakimkolwiek procesie, do którego społeczeństwo będzie miało dostęp (np. Strona internetowa). Zaleca się utworzenie użytkownika z uprawnieniami do bazy danych do tego rodzaju zastosowań.

diagonalbatman
źródło
35
@Rainain, że tak naprawdę nie przynosisz tutaj dużo tabeli - nie nazywam moich użytkowników myuser - pytający po prostu używał nazwy użytkownika jako przykładu - użyłem tej samej przykładowej nazwy użytkownika dla zachowania spójności.
diagonalbatman
22
Słusznie. Ale trzeba też pomyśleć o innych ludziach, być może początkujących, którzy mogą później przeczytać to pytanie. Czy to nie jest sens SO?
Romain
7
Nie sądzę też, aby ta odpowiedź była dobra. Daje uprawnienia „administratora” we wszystkich bazach danych i wszystkich tabelach, o co nie pytano.
daks
5
Zredagowałem tę odpowiedź, by powiedzieć mydb. * Zamiast . , ponieważ jest to tak szeroko oceniana i przeglądana odpowiedź, i uważam, że bezpieczeństwo - szczególnie w przypadku wypolerowanej wersji, takiej jak MySQL - jest niezwykle ważne. Można by mieć nadzieję, że czytelnik zbada szczegóły odpowiedzi, zamiast kopiować i wklejać, ale czasami lubię żyć w rzeczywistości.
Jordan
4
@Romain Użytkownicy konfigurujący serwer MySQL są prawdopodobnie wystarczająco inteligentni, aby zdać sobie sprawę, że powinni zastąpić myuserwłasną, niestandardową nazwą użytkownika.
AStopher
524

To stare pytanie, ale nie sądzę, aby zaakceptowana odpowiedź była bezpieczna. Jest dobry do tworzenia superużytkowników, ale nie jest dobry, jeśli chcesz nadać uprawnienia do pojedynczej bazy danych.

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

%wydaje się nie obejmować komunikacji gniazdowej, po co localhost. WITH GRANT OPTIONjest dobry tylko dla superużytkownika, w przeciwnym razie zwykle stanowi zagrożenie bezpieczeństwa.

Aktualizacja MySQL 5.7+ wydaje się ostrzegać przed:

Używanie instrukcji GRANT do modyfikowania istniejących właściwości użytkownika innych niż uprawnienia jest nieaktualne i zostanie usunięte w przyszłej wersji. Do tej operacji użyj instrukcji ALTER USER.

Tak więc ustawienie hasła powinno odbywać się za pomocą osobnych poleceń. Dzięki komentarzowi od @ scary-wombat.

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

Mam nadzieję że to pomoże.

akostadinov
źródło
26
+1 za nieuwzględnianie WITH GRANT OPTIONokreślonej bazy danych i kierowanie na nią zamiast wszystkich ( *).
Adonis K. Kakoulidis
@IanBussieres gramatyka „% wydaje się nie obejmować komunikacji przez gniazda, dla której jest host lokalny” jest niejasna. Co to właściwie znaczy?
Thufir
2
@Thufir, wyszukaj unix sockets. Podczas korzystania z localhostklienta myslq na Linuksie próbuje użyć gniazda unix zamiast połączenia TCP z serwerem.
akostadinov
1
Zauważ, że prawdopodobnie nie potrzebujesz pierwszego polecenia, chyba że chcesz uzyskać dostęp z zewnętrznych adresów IP lub z innych komputerów w lokalnej podsieci. Jeśli tak, zalecam używanie poleceń skierowanych do określonych adresów IP, na które chcesz zezwolić, takich jak [email protected] (dla jednego w lokalnej podsieci), zamiast ogólnie myuser @%.
Evan Donovan
1
mysql> ALTER USER 'root' @ 'localhost' IDENTIFIED BY 'new_password';
Scary Wombat
121

Będzie to pomocne dla niektórych osób:

Z wiersza poleceń MySQL:

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

Niestety, w tym momencie newuser nie ma uprawnień do robienia czegokolwiek z bazami danych. W rzeczywistości, jeśli newuser nawet spróbuje się zalogować (za pomocą hasła, hasła), nie będzie w stanie uzyskać dostępu do powłoki MySQL.

Dlatego pierwszą rzeczą do zrobienia jest zapewnienie użytkownikowi dostępu do potrzebnych mu informacji.

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

Gwiazdki w tym poleceniu odnoszą się odpowiednio do bazy danych i tabeli, do których mogą uzyskać dostęp - to konkretne polecenie pozwala użytkownikowi czytać, edytować, wykonywać i wykonywać wszystkie zadania we wszystkich bazach danych i tabelach.

Po sfinalizowaniu uprawnień, które chcesz skonfigurować dla nowych użytkowników, zawsze pamiętaj, aby ponownie załadować wszystkie uprawnienia.

FLUSH PRIVILEGES;

Twoje zmiany zaczną obowiązywać.

Aby uzyskać więcej informacji: http://dev.mysql.com/doc/refman/5.6/en/grant.html

Jeśli nie masz doświadczenia z wierszem poleceń, możesz użyć klienta, takiego jak MySQL workbench , Navicat lub SQLyog

BrenBarn
źródło
5
flush privilegesnie jest potrzebne, gdy używasz grantpoleceń. x4
Pacerier
1
Albo hurtowo skopiowałeś z Linode, albo skopiowali od ciebie: linode.com/docs/databases/mysql/…
Musiałem się ponownie zidentyfikować z GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;(dziwne ..., ale prawdziwe)
rubo77
30

 1. Utwórz bazę danych

CREATE DATABASE db_name;

 2. Utwórz nazwę użytkownika dla bazy danych nazwa_db

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

 3. Użyj bazy danych

USE db_name;

 4. W końcu znajdujesz się w bazie danych nazwa_db, a następnie wykonaj polecenia takie jak tworzenie, wybieranie i wstawianie.

Bhavnesh
źródło
Dzisiaj dało mi to ostrzeżenie: „Używanie instrukcji GRANT do modyfikowania istniejących właściwości użytkownika innych niż uprawnienia jest nieaktualne i zostanie usunięte w przyszłej wersji. Użyj tej instrukcji dla instrukcji ALTER USER”. Czy powinienem więc zrozumieć, że powinienem utworzyć użytkownika, a następnie przyznać uprawnienia?
felwithe
Jak możesz powiedzieć MySQL, że usernamepowinien mieć wszystkie przywileje, db_nameale nie DROP db_name;przywilej?
tonix
21

Ten SQL udziela wszystkich baz danych, ale tylko podstawowe uprawnienia. Są wystarczające dla Drupala lub Wordpressa i jako drobiazg pozwalają na jedno konto programisty dla lokalnych projektów.

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, 
    INDEX, ALTER, CREATE TEMPORARY TABLES 
ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';
s6712
źródło
20
GRANT ALL PRIVILEGES ON mydb.* TO myuser@localhost IDENTIFIED BY 'mypasswd';

Działa dla uprawnień do schematu :)

Opcjonalnie: po mypasswddodaniuWITH GRANT OPTION

Holenderska chwała
źródło
15

Mógłbym sprawić, by działało tylko poprzez dodanie GRANT OPTION, bez tego zawsze otrzymuję błąd odmowy uprawnień

GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost' WITH GRANT OPTION;
GnanaPrakash
źródło
14

Witam Użyłem tego kodu, aby mieć superużytkownika w 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;

i wtedy

FLUSH PRIVILEGES;
gastonnina
źródło
11
flush privilegesnie jest potrzebne, gdy używasz grantpoleceń. x4
Pacerier
Uwaga: dokładna lista GRANTróżni się w zależności od wersji MySQL.
Rick James
6

Aby uzyskać dostęp ze zdalnego serwera tylko do bazy danych mydb

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

Aby uzyskać dostęp ze zdalnego serwera do wszystkich baz danych.

GRANT ALL PRIVILEGES ON * . * TO 'root'@'192.168.2.21';
Deweloper
źródło
4

Aby przyznać wszystkie uprawnienia do bazy danych: mydbużytkownikowi: myuserpo prostu wykonaj:

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

lub:

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

Słowo PRIVILEGESkluczowe nie jest konieczne.

Nie wiem też, dlaczego inne odpowiedzi sugerują, że należy IDENTIFIED BY 'password'je umieścić na końcu polecenia. Uważam, że nie jest to wymagane.

pgmank
źródło