2010-06-16 17 views
16

Jak mogę sprawdzić, czy użytkownik istnieje?Sprawdzanie, czy istnieje użytkownik mysql

Robię instalator dla bazy danych mysql, i muszę sprawdzić, czy użytkownik zakończy działanie, jeśli nie utworzy użytkownika, jeśli tak, usuń użytkownika i utwórz go ponownie.

dzięki temu mogę wykonać skrypt bez obaw.

dzięki.

Odpowiedz

5

Jeśli usuniesz użytkownika MySQL tak czy inaczej, to naprawdę nie ma potrzeby sprawdzania, czy istnieje on wcześniej. MySQL nie rzuci jakieś błędy, jeśli nie ma nic do usunięcia:

DELETE FROM mysql.user WHERE User = 'username'; 
+0

+1 za myślenie o krok do przodu .. Podoba mi się –

+6

Spowoduje to usunięcie użytkownika tylko z tabeli użytkownika, jeśli podejmiesz takie podejście, musisz usunąć także z mysql.columns_priv, mysql.db, mysql.tables_priv . Również ta lista tabel może ulec zmianie w przyszłych wersjach MySQL. – stivlo

+0

Nigdy nie usuwaj użytkownika w ten sposób. Użyj polecenia 'DROP USER'. –

49

MySQL przechowuje dane użytkownika w tabeli o nazwie user w bazie danych o nazwie mysql (domyślnie). Poniższa kwerenda zwróci 1, jeśli użytkownik z podaną nazwą użytkownika istnieje, 0 w przeciwnym razie.

SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = 'username') 
0

MySQL brakuje DROP USER IF EXISTS skonstruować.

Dobrym rozwiązaniem jest przyznanie użytkownikowi nieszkodliwego przywileju przed jego upuszczeniem. Ten stworzy użytkownika, jeśli nie istnieje, tak, że można go bezpiecznie spadły, tak jak poniżej:

GRANT USAGE ON *.* TO 'username'@'localhost'; 
DROP USER 'username'@'localhost'; 
FLUSH PRIVILEGES; 

ZASTOSOWANIE faktycznie oznacza brak przywileju.

Źródło: http://bugs.mysql.com/bug.php?id=19166

+2

Dla potomności to obejście już nie działa. Cytując z komentarza innej odpowiedzi: "To już nie jest opcja. :(Obecna wersja MySQL nie tworzy już nowego użytkownika dla instrukcji GRANT, ale była to" funkcja ", którą dodali.)" Aby uzyskać oryginalne odniesienie zobacz: http://stackoverflow.com/a/3241918/656243 –

0

W ten sposób udało mi się zrobić:

#!/usr/bin/env bash 

set -o errexit 
set -o nounset 

# Create credentials file 
echo -e "[client]\nuser=root\npassword=${MYSQL_ROOT_PASSWORD}" > ~/.my.cnf 

# Create standard user and grant permissions 
if ! echo "SELECT COUNT(*) FROM mysql.user WHERE user = 'myuser';" | mysql | grep 1 &> /dev/null; then 
    echo "Creating database user ..." 
    echo "CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword'; 
      GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'localhost'; 
      FLUSH PRIVILEGES;" | mysql 
else 
    echo "Database user already created. Continue ..." 
fi 

Zmień myuser, mydatabase i mypassword odpowiednio.

+0

To nie działa dobrze, jeśli nazwa użytkownika zawiera cyfrę 1. Więc może to powodować pułapki. – Joachim

+0

@Joachim po prostu przetestował go z użytkownikiem z 1 w nazwie użytkownika i działa idealnie. Jesteś pewny? Dlaczego nie powinien działać dla użytkownika z 1? – Havok

Powiązane problemy