Es gibt keine Standardmethode, um zu überprüfen, ob ein MySQL-Benutzer vorhanden ist, und basierend darauf zu löschen. Gibt es dafür Problemumgehungen?
Bearbeiten: Ich brauche einen direkten Weg, um dies auszuführen, ohne einen Fehler auszulösen,
z
DROP USER test@localhost; :
Antworten:
Seit MySQL 5.7 können Sie eine
DROP USER IF EXISTS test
Weitere Informationen: http://dev.mysql.com/doc/refman/5.7/en/drop-user.html
quelle
Das hat bei mir funktioniert:
Dadurch wird der Benutzer erstellt, sofern er noch nicht vorhanden ist (und ihm ein harmloses Privileg gewährt), und dann in beide Richtungen gelöscht. Hier finden Sie eine Lösung: http://bugs.mysql.com/bug.php?id=19166
Updates: @Hao empfiehlt das Hinzufügen
IDENTIFIED BY
; @andreb (in Kommentaren) schlägt die Deaktivierung vorNO_AUTO_CREATE_USER
.quelle
IDENTIFIED BY
, damit das tatsächlich funktioniert.Auf die Antwort von Phyzome (die am höchsten bewertete) scheint es mir, dass der Benutzer automatisch erstellt wird, wenn Sie am Ende der Bewilligungserklärung "identifiziert durch" einfügen. Wenn Sie dies nicht tun, wird der Benutzer nicht erstellt. Der folgende Code funktioniert für mich:
Hoffe das hilft.
quelle
Die Antwort darauf fand ich in einem der MySQL-Foren. Wir müssen eine Prozedur verwenden, um den Benutzer zu löschen.
Benutzer hier ist "test" und "databaseName" der Datenbankname.
quelle
das funktioniert bei mir ohne fehler in Maria DB zu werfen, es sollte auch bei dir funktionieren
quelle
Update: Ab MySQL 5.7 können Sie
DROP USER IF EXISTS
Anweisungen verwenden. Ref: https://dev.mysql.com/doc/refman/5.7/en/drop-user.htmlZu Ihrer Information (und für ältere Versionen von MySQL) ist dies eine bessere Lösung ... !!!
Der folgende SP hilft Ihnen, Benutzer
'tempuser'@'%'
durch Ausführen zu entfernenCALL DropUserIfExistsAdvanced('tempuser', '%');
Wenn Sie alle Benutzer entfernen genannt
'tempuser'
(sagen wir'tempuser'@'%'
,'tempuser'@'localhost'
und'tempuser'@'192.168.1.101'
) ausführen SP wieCALL DropUserIfExistsAdvanced('tempuser', NULL);
diese Weise werden alle Benutzer namens löschentempuser
!!! Ernsthaft...Schauen Sie sich jetzt bitte das erwähnte SP an
DropUserIfExistsAdvanced
:Verwendung:
CALL DropUserIfExistsAdvanced('tempuser', '%');
Benutzer entfernen'tempuser'@'%'
CALL DropUserIfExistsAdvanced('tempuser', '192.168.1.101');
Benutzer entfernen'tempuser'@'192.168.1.101'
CALL DropUserIfExistsAdvanced('tempuser', NULL);
entfernen Sie alle Benutzer benannt'tempuser'
(z. B. sagen'tempuser'@'%'
,'tempuser'@'localhost'
und'tempuser'@'192.168.1.101'
)quelle
Ähm ... Warum all die Komplikationen und Tricks?
Verwenden Sie stattdessen DROP USER ... Sie können den Benutzer einfach aus der Tabelle mysql.user löschen (die keinen Fehler auslöst, wenn der Benutzer nicht vorhanden ist) und dann die Berechtigungen löschen, um die Änderung zu übernehmen.
- UPDATE -
Ich lag falsch. Es ist nicht sicher, den Benutzer so zu löschen. Sie müssen DROP USER verwenden. Da es möglich ist, MySQL-Optionen so einzustellen, dass Benutzer nicht automatisch über Zuschüsse erstellt werden (eine Option, die ich verwende), würde ich diesen Trick immer noch nicht empfehlen. Hier ist ein Ausschnitt aus einer gespeicherten Prozedur, die für mich funktioniert:
quelle
In Bezug auf die Antwort von @ Cherian können die folgenden Zeilen entfernt werden:
Dies war ein Fehler vor 5.1.23. Nach dieser Version werden diese nicht mehr benötigt. Aus Gründen der Bequemlichkeit beim Kopieren und Einfügen ist hier dasselbe mit den oben entfernten Zeilen entfernt. Wiederum ist beispielsweise "Test" der Benutzer und "Datenbankname" die Datenbank; und das war von diesem Fehler .
quelle
Ich habe dieses Verfahren geschrieben, inspiriert von Cherians Antwort. Der Unterschied besteht darin, dass in meiner Version der Benutzername ein Argument der Prozedur ist (und nicht fest codiert ist). Ich mache auch ein sehr notwendiges FLUSH PRIVILEGES, nachdem ich den Benutzer fallen gelassen habe.
Ich habe diesen Code auch auf der CodeReview-Website veröffentlicht ( /codereview/15716/mysql-drop-user-if-exists ).
quelle
Mit dem obigen Befehl wird der Benutzer aus der Datenbank entfernt. Es ist jedoch wichtig zu wissen, ob derselbe Benutzer die Datenbank bereits verwendet. Diese Sitzung wird erst beendet, wenn der Benutzer diese Sitzung schließt. Es ist wichtig zu beachten, dass abgelegte Benutzer NOCH auf die Datenbank zugreifen und alle Vorgänge ausführen. Wenn Sie den Benutzer fallen lassen, wird die aktuelle Benutzersitzung nicht fallen gelassen
quelle
Durch die Kombination der Antwort von Phyzome (die bei mir nicht sofort funktioniert hat) mit dem Kommentar von andreb (was erklärt, warum dies nicht der Fall war) erhielt ich diesen scheinbar funktionierenden Code, der den NO_AUTO_CREATE_USER-Modus vorübergehend deaktiviert, wenn er aktiv ist:
quelle
im Terminal tun:
Geben Sie das Passwort ein.
Löschen Sie nun den Benutzer 'the_username'.
Ersetzen Sie 'the_username' durch den Benutzer, den Sie löschen möchten.
quelle
Falls Sie einen Schulserver haben, auf dem die Schüler viel gearbeitet haben. Sie können das Chaos einfach aufräumen, indem Sie:
quelle
Wenn Sie meinen, dass Sie einen Drop aus einer Tabelle löschen möchten, falls vorhanden, können Sie den folgenden
DELETE
Befehl verwenden:Wenn keine Zeilen übereinstimmen, ist dies kein Fehler.
quelle