MySQL-Fehler 1449: Der als Definierer angegebene Benutzer existiert nicht

352

Wenn ich die folgende Abfrage ausführe, wird eine Fehlermeldung angezeigt:

SELECT
  `a`.`sl_id`                     AS `sl_id`,
  `a`.`quote_id`                  AS `quote_id`,
  `a`.`sl_date`                   AS `sl_date`,
  `a`.`sl_type`                   AS `sl_type`,
  `a`.`sl_status`                 AS `sl_status`,
  `b`.`client_id`                 AS `client_id`,
  `b`.`business`                  AS `business`,
  `b`.`affaire_type`              AS `affaire_type`,
  `b`.`quotation_date`            AS `quotation_date`,
  `b`.`total_sale_price_with_tax` AS `total_sale_price_with_tax`,
  `b`.`STATUS`                    AS `status`,
  `b`.`customer_name`             AS `customer_name`
FROM `tbl_supplier_list` `a`
  LEFT JOIN `view_quotes` `b`
    ON (`b`.`quote_id` = `a`.`quote_id`)
LIMIT 0, 30

Die Fehlermeldung lautet:

#1449 - The user specified as a definer ('web2vi'@'%') does not exist

Warum erhalte ich diesen Fehler? Wie behebe ich das?

Tech MLG
quelle
7
Zeigen Sie uns Ihre SHOW CREATE VIEW 'view_quotes'
jordeu
Der Fehler muss in der Sichtbedingung liegen view_quotes.
Shell
Nachdem Sie einen Moment darüber nachgedacht hatten und die einfachste Vorgehensweise darin bestand, das fehlende Konto zur Datenbank hinzuzufügen, verschwand der Fehler. Kein kompliziertes Verfahren erforderlich. Wenn Sie das Konto hinzufügen können, versuchen Sie dies zuerst.
user1794918

Antworten:

539

Dies tritt häufig auf, wenn Ansichten / Trigger / Prozeduren von einer Datenbank oder einem Server auf eine andere exportiert werden, da der Benutzer, der das Objekt erstellt hat, nicht mehr vorhanden ist.

Sie haben zwei Möglichkeiten:

1. Ändern Sie den DEFINER

Dies ist möglicherweise am einfachsten, wenn Sie Ihre Datenbankobjekte anfänglich importieren, indem Sie alle DEFINERAnweisungen aus dem Speicherauszug entfernen .

Das spätere Ändern des Definierers ist etwas schwieriger:

So ändern Sie den Definierer für Ansichten

  1. Führen Sie diese SQL aus, um die erforderlichen ALTER-Anweisungen zu generieren

    SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ", 
    table_name, " AS ", view_definition, ";") 
    FROM information_schema.views 
    WHERE table_schema='your-database-name';
  2. Kopieren Sie die ALTER-Anweisungen und führen Sie sie aus

So ändern Sie den Definierer für gespeicherte Prozeduren

Beispiel:

UPDATE `mysql`.`proc` p SET definer = 'user@%' WHERE definer='root@%'

Seien Sie vorsichtig, da dadurch alle Definierer für alle Datenbanken geändert werden.

2. Erstellen Sie den fehlenden Benutzer

Wenn Sie bei der Verwendung der MySQL-Datenbank folgenden Fehler festgestellt haben:

The user specified as a definer ('someuser'@'%') does not exist`

Dann können Sie es lösen, indem Sie Folgendes verwenden:

GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password';
FLUSH PRIVILEGES;

Von http://www.lynnnayko.com/2010/07/mysql-user-specified-as-definer-root.html

Dies funktionierte wie ein Zauber - Sie müssen nur someuserden Namen des vermissten Benutzers ändern . Auf einem lokalen Entwicklungsserver verwenden Sie normalerweise nur root.

Überlegen Sie auch, ob Sie den Benutzern tatsächlich ALLBerechtigungen erteilen müssen oder ob sie mit weniger auskommen könnten.

Chococroc
quelle
1
. und Grant-Option sind nicht erforderlich.
Helpse
@ Simon East: Du hast eine schöne Bearbeitung gemacht, vielen Dank, dass du die Antwort so sehr verbessert hast.
Chococroc
Ich schlage vor, die mySQL-Instanz nach dem Ausführen der Abfrage "UPDATE mysql. procP SET definer = 'user @%' WHERE definer = 'root @%'" hinzuzufügen und neu zu starten, da die Definierer der Prozeduren erst dann aktualisiert werden.
Joan
1
Ich denke, es ist einfacher, bedeutungslose Benutzer hinzuzufügen, da Sie beim nächsten Ausführen und Importieren eines Datenbankabbaus die Ansichten / Prozeduren nicht erneut bearbeiten müssen
DarkMukke,
1
Vielen Dank, ich habe gerade die Tabelle mit dem Problem gelöscht, entfernt DEFINER=`user`@`host`und erneut importiert. Lief wie am Schnürchen. : ok_hand:
Giovannipds
139

Der Benutzer, der ursprünglich die SQL-Ansicht oder -Prozedur erstellt hat, wurde gelöscht. Wenn Sie diesen Benutzer neu erstellen, sollte er Ihren Fehler beheben.

Dave Z Dopson
quelle
3
Außerdem müssen Sie dem hinzugefügten Benutzer mindestens die Berechtigungen SELECTund gewähren EXECUTE. Ich bin darauf gestoßen, als ich eine DB-Sicherung von einem Server auf einen anderen exportiert habe, auf dem der Benutzer, der die Routinen erstellt hat, auf dem Testserver nicht vorhanden war.
Draw010
5
Danke, das war hilfreich. Bei der Migration oder Bereitstellung mit mysqldump ist der Benutzer, der VIEW, TRIGGER oder PROCEDURE (der Definierer) erstellt hat, auf dem Zielsystem häufig nicht identisch. In diesem Fall sollte nur die Prozedur neu erstellt, ausgelöst oder mit einem gültigen Benutzer auf dem Zielsystem DROPangezeigt (und dann erneut CREATE) werden.
Eric Kigathi
38
Sie können auch ändern, wer der Definierer für einen vorhandenen Benutzer ist:UPDATE mysql.proc SET definer = 'my_new_user@localhost' WHERE db = 'mydatatbase';
1
Genau in meinem Fall hatte ich eine Tabelle mit Trigger, die auf einen DEFINER-Benutzer zeigte, der gelöscht wurde. Das Aktualisieren des Trigger-Benutzers hat das Problem behoben.
Miguel
Sie müssen diesem Benutzer auch die Erlaubnis geben :) GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password'; FLUSH PRIVILEGES;
Victor
50

Ich habe den gleichen Fehler nach dem Aktualisieren von MySQL.

Der Fehler wurde nach diesem Befehl behoben:

mysql_upgrade -u root

mysql_upgrade sollte jedes Mal ausgeführt werden, wenn Sie MySQL aktualisieren. Es überprüft alle Tabellen in allen Datenbanken auf Inkompatibilitäten mit der aktuellen Version von MySQL Server. Wenn festgestellt wird, dass eine Tabelle möglicherweise inkompatibel ist, wird sie überprüft. Wenn Probleme festgestellt werden, wird die Tabelle repariert. mysql_upgrade aktualisiert auch die Systemtabellen, sodass Sie neue Berechtigungen oder Funktionen nutzen können, die möglicherweise hinzugefügt wurden.

artamonovdev
quelle
Ich bin mir nicht sicher, warum dies bei mir nicht funktioniert hat. Ich musste alle Trigger in der mySQL-Workbench manuell entfernen.
user752746
35

Wenn der Benutzer existiert, dann:

mysql> flush privileges;
BroknDodge
quelle
34

Erstellen Sie den gelöschten Benutzer folgendermaßen:

mysql> create user 'web2vi';

oder

mysql> create user 'web2vi'@'%';
Kevin
quelle
3
Nach dem Erstellen dieses vermissten Benutzers ist ein weiterer Fehler aufgetreten: ERROR 1142 (42000): TRIGGER command denied to user 'web2vi'@'%' for table 'foo'und sollte diesen Befehl grant all on *.* to 'web2vi'@'%' identified by ''nach dem Erstellen des Benutzers hinzufügen
zhuguowei
31

Folge diesen Schritten:

  1. Gehen Sie zu PHPMyAdmin
  2. Wählen Sie Ihre Datenbank
  3. Wählen Sie Ihren Tisch
  4. Klicken Sie im oberen Menü auf "Trigger".
  5. Klicken Sie auf "Bearbeiten", um den Trigger zu bearbeiten
  6. Ändern Sie den Definierer von [user @ localhost] in root @ localhost

Ich hoffe es hilft

Hussainfrotan
quelle
1
Dies ist die eigentliche Lösung für die Frage, anstatt Benutzer zu erstellen und Berechtigungen zu erteilen. Ändern Sie einfach den Definierer.
Ankit Chauhan
Gibt es eine Möglichkeit, alle Trigger in der Datenbank zu finden?
Mrugesh Mistry
1
Finde alle Auslöser: SHOW TRIGGERS
JerzySkalski
Wählen Sie in der
Befehlszeile
21

Die Lösung ist nur eine einzeilige Abfrage wie folgt:

grant all on *.* to 'ROOT'@'%' identified by 'PASSWORD' with grant option;

Ersetzen Sie ROOTdurch Ihren MySQL-Benutzernamen. Ersetzen Sie PASSWORDdurch Ihr MySQL-Passwort.

Muhammad Azeem
quelle
1
Seien Sie vorsichtig: Bei MySQL-Benutzern wird zwischen Groß- und Kleinschreibung unterschieden.
Alessio Cantarella
Ich musste flush privilegesdanach und es funktioniert. Vielen Dank.
Victor
14

Behoben durch Ausführen der folgenden Kommentare.

grant all on *.* to 'web2vi'@'%' identified by 'root' with grant option;
FLUSH PRIVILEGES;

Wenn Sie some_otherstattdessen bekommen web2vi, müssen Sie den Namen entsprechend ändern.

Selvamani
quelle
13

Für zukünftige Googler: Ich habe eine ähnliche Meldung erhalten, in der versucht wurde, eine Tabelle in einer Datenbank zu aktualisieren, die keine Ansichten enthielt. Nach einigem Graben stellte sich heraus, dass ich Trigger in diese Tabelle importiert hatte, und das waren die Dinge, die vom nicht existierenden Benutzer definiert wurden. Das Löschen der Trigger löste das Problem.

Chris Poirier
quelle
Auslöser war das Problem, ich habe den Definierer im Abschnitt Auslöser aktualisiert. keine Probleme mehr.
Darius
Danke, es ist sehr hilfreich. Müssen auch Ansichten aktualisieren.
Toxxxa
In der Tat sehr hilfreich :) Ich würde das nie alleine finden.
ElChupacabra
7

Der Benutzer 'web2vi' existiert nicht auf Ihrem MySQL-Server.

Siehe http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html#error_er_no_such_user

Wenn dieser Benutzer vorhanden ist, überprüfen Sie, von welchen Servern aus er auf ihn zugreifen kann, obwohl ich gedacht hätte, dass dies ein anderer Fehler wäre (z. B. haben Sie möglicherweise web2vi @ localhost, aber Sie greifen als web2vi @% auf die Datenbank zu (überhaupt).

Cosmorogers
quelle
7

Schnelle Lösung, um die Datei zu umgehen und zu sichern:

mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql
Entwickler
quelle
1
Das funktioniert nicht. Der Definierer ist in der Müllkippe enthalten.
Phil294
Wenn Sie mysqlpump mit einem "p" anstelle eines "d" verwenden, können Sie --skip-definer
Wouter
@lyhong Ich habe keine detaillierte Erklärung, aber anscheinend --single-transactionändert sich die Art und Weise, wie Lock Tables während eines Dumps implementiert wird. Oder etwas ähnliches. Ich erinnere mich nicht, wo ich es gelesen habe, aber das hat mir geholfen, mich wohl zu fühlen, wenn ich nur die Flagge hineingeworfen habe. Ich bin auch unzufrieden mit unerklärlichen "Antworten". In jedem Fall hat es für meinen Fall funktioniert.
SherylHohman
7
grant all on *.* to 'username'@'%' identified by 'password' with grant option;

Beispiel:

grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;
Mesutpiskin
quelle
Wenn ich einem 'Benutzer' @ 'all ips' alle Berechtigungen erteile, was ist dann mit Sicherheit ?? !!
Mohsen Abasi
@MohsenAbasi Dies ist ein Beispiel für die Entwicklungsumgebung. Dieser Benutzer kann der Systemadministrator sein. Die Produktumgebung muss vorsichtiger sein.
Mesutpiskin
7

Dies ist mir passiert, nachdem ich die Datenbank von einem Server auf einen anderen Server verschoben habe. Anfangs verwendete der Definierer localhost und den Benutzer. Auf dem neuen Server haben wir diesen Benutzer nicht, und der Host wurde ebenfalls geändert. Ich habe eine Sicherungskopie dieser bestimmten Tabelle erstellt und alle Trigger manuell von phpmyadmin entfernt . Danach hat es für mich gut funktioniert.

TS Guhan
quelle
Vielen Dank für den Tipp, ich konnte alle Trigger in der mySQL-Workbench manuell entfernen.
user752746
Dies war in der Tat ein Auslöserproblem für mich, ich musste sie alle entfernen und neu erstellen
paul.ago
Gibt es eine andere Lösung als die Neuerstellung von Triggern? Ich benutze manchmal zweimal am Tag Test-Dumps. Dies würde meine Hauptprozesse stören
Redestructa
@TS Guhan Haben Sie die Trigger erneut hinzugefügt, nachdem Sie sie manuell entfernt haben?
MailBlade
6

Ich hatte das gleiche Problem mit dem Root-Benutzer und es funktionierte bei mir, als ich es ersetzte

root@%

durch

root@localhost

Wenn der Benutzer 'web2vi' von 'localhost' aus eine Verbindung herstellen darf, können Sie Folgendes versuchen:

web2vi@localhost

Ich bin remote mit der Datenbank verbunden.

c-toesca
quelle
4

Meine 5 Cent.

Ich hatte den gleichen Fehler, als ich versuchte, aus einer Ansicht auszuwählen.

Das Problem scheint jedoch zu sein, dass diese Ansicht aus einer anderen Ansicht ausgewählt wurde, die aus einer Sicherung von einem anderen Server wiederhergestellt wurde.

und in der Tat, JA, Benutzer war ungültig, aber es war nicht klar, wohin er auf den ersten Blick gehen sollte.

Nick
quelle
4

Ich hatte vor Minuten das gleiche Problem. Ich bin auf dieses Problem gestoßen, nachdem ich einen nicht verwendeten Benutzer aus der Tabelle mysql.user gelöscht habe. Durch Ändern einer Ansicht wurde das Problem behoben. Hier ist ein praktischer Befehl, der es sehr einfach macht:

SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ",
table_name," AS ", view_definition,";") FROM 
information_schema.views WHERE table_schema='databasename'

Mischen Sie dies mit der MySQL-Befehlszeile (vorausgesetzt * nix, nicht vertraut mit Windows):

> echo above_query | mysql -uuser -p > alterView.sql
> mysql -uuser -ppass databasename < alterView.sql

Hinweis: Der Befehl generiert ein zusätzliches SELECT CONCAT für die Datei und schlägt mysql -uuser -ppass databasename < alterView.sqlfehl, wenn Sie es nicht entfernen.

Quelle: /dba/4129/modify-definer-on-many-views

Ziul
quelle
4

Versuchen Sie, Ihre Prozedur als festzulegen SECURITY INVOKER

Mysql setzt die Prozedursicherheit standardmäßig auf "DEFINER" (CREATOR OF). Sie müssen die Sicherheit auf "invoker" setzen.

Allan Felipe Murara
quelle
3

Ihre Ansicht "view_quotes" wurde möglicherweise aus einer anderen Datenbank, in der "web2vi" ein gültiger Benutzer ist, in eine Datenbank kopiert, in der "web2vi" kein gültiger Benutzer ist.
Fügen Sie entweder den Benutzer "web2vi" zur Datenbank hinzu oder ändern Sie die Ansicht (normalerweise reicht es aus, den Teil DEFINER = 'web2vi' @ '%' zu entfernen und das Skript auszuführen).

user1016736
quelle
3

In meinem Fall hatte die Tabelle einen Trigger mit einem DEFINER-Benutzer, der nicht vorhanden war.

jbaylina
quelle
2
direkt auf den Nagel, besonders wenn die App von einem Server auf einen anderen übertragen wird
zardilior
2

Aus der MySQL-Referenz von CREATE VIEW:

Die Klauseln DEFINER und SQL SECURITY geben den Sicherheitskontext an, der beim Überprüfen der Zugriffsrechte zum Zeitpunkt des Aufrufs der Ansicht verwendet werden soll.

Dieser Benutzer muss vorhanden sein und es ist immer besser, 'localhost' als Hostnamen zu verwenden. Ich denke also, dass Sie diesen Fehler nicht haben, wenn Sie überprüfen, ob der Benutzer vorhanden ist, und ihn in der Erstellungsansicht in "localhost" ändern.

jordeu
quelle
2

Das Problem ist klar - MySQL kann den als Definierer angegebenen Benutzer nicht finden.

Ich bin auf dieses Problem gestoßen, nachdem ich das Datenbankmodell vom Entwicklungsserver synchronisiert, auf localhost angewendet, Änderungen am Modell vorgenommen und es dann erneut auf localhost angewendet habe. Anscheinend wurde eine Ansicht (die ich geändert habe) definiert, sodass ich meine lokale Version nicht aktualisieren konnte.

So beheben Sie (einfach) :

Hinweis: Es wird gelöscht, damit es für Ansichten einwandfrei funktioniert. Stellen Sie jedoch sicher, dass die Daten gesichert sind, wenn Sie dies für Tabellen versuchen.

  1. Melden Sie sich als root bei der Datenbank an (oder was auch immer genug Leistung hat, um Änderungen vorzunehmen).
  2. Löschen Sie die Ansicht, Tabelle oder was auch immer Sie Probleme haben.
  3. Synchronisieren Sie Ihr neues Modell - es wird sich nicht über etwas beschweren, das jetzt nicht existiert. Möglicherweise möchten Sie den SQL SECURITY DEFINER- Teil aus der Elementdefinition entfernen, mit der Sie Probleme hatten.

PS Dies ist weder eine richtige noch eine umfassende Lösung. Ich habe es gerade als mögliche (und sehr einfache) Lösung veröffentlicht.

Pijusn
quelle
Ich benutze Kröte, cn ich lösche und erstelle mit diesem nur OS sollte ich mich als Rooy vom Terminal anmelden und dann nur tun?
Vasanth Nag KV
2

Sie können dies versuchen:

$ mysql -u root -p 
> grant all privileges on *.* to `root`@`%` identified by 'password'; 
> flush privileges;
Sukamdani Barli
quelle
2

Warum erhalte ich diesen Fehler? Wie behebe ich das?

Ich habe eine Stunde zuvor eine Entscheidung für ein solches Problem gefunden. Aber in meinem Fall habe ich Folgendes ausgeführt:

mysql> UPDATE `users` SET `somefield` = 1 WHERE `user_id` = 2;
ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist

Wenn Sie das Problem wirklich finden möchten, führen Sie diese Befehle einfach nacheinander aus:

SHOW PROCEDURE STATUS;
SHOW FUNCTION STATUS;
SHOW TRIGGERS;
SHOW FULL TABLES IN database_name WHERE TABLE_TYPE LIKE 'VIEW';

... und suchen Sie nach jedem von ihnen nach dem Feld 'Definer'.

In meinem Fall war es ein bärtiger alter Auslöser, den jemand von Entwicklern vergessen hat zu löschen.

kivagant
quelle
1

Gehen Sie in den Abschnitt Bearbeitungsroutine und ändern Sie unten den Sicherheitstyp von Definer in Invoker.

user1174436
quelle
4
Wohin gehen? In welcher Software?
Kenorb
@kenorb, in phpMyAdmin können Sie gespeicherte MySQL-Routinen (Prozeduren und Funktionen) ändern, z. B. Sicherheitstyp.
Mikl
1

Eine oder mehrere Ihrer Ansichten wurden von einem anderen Benutzer erstellt / registriert. Sie müssen den Eigentümer der Ansicht überprüfen und:

  1. Erstellen Sie den Benutzer neu. wie die anderen Antworten sagen. oder
  2. Erstellen Sie die vom Benutzer erstellten Ansichten 'web2vi'mit ALTER VIEW neu

Ich hatte dieses Problem einmal.

Ich habe versucht, Ansichten mit SQLYog von BD1 auf BD2 zu migrieren. SQLYog hat die Ansichten in der anderen Datenbank (DB2) neu erstellt, den Benutzer von BD1 jedoch beibehalten (sie waren unterschiedlich). Später stellte ich fest, dass die Ansichten, die ich in meiner Abfrage verwendete, denselben Fehler hatten wie Sie, auch wenn ich keine Ansicht erstellt habe.

Ich hoffe das hilft.

Julio Indriago
quelle
1

Wenn dies eine gespeicherte Prozedur ist, können Sie Folgendes tun:

UPDATE `mysql`.`proc` SET definer = 'YournewDefiner' WHERE definer='OldDefinerShownBefore'

Dies wird jedoch nicht empfohlen.

Für mich ist es eine bessere Lösung, den Definierer zu erstellen:

create user 'myuser' identified by 'mypass';
grant all on `mytable`.* to 'myuser' identified by 'mypass';
Hilfe
quelle
Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung von "Alle auf" mytable gewähren ". * für" myuser ", gekennzeichnet durch" mypass ";" in Zeile 1
Cerin
@Cerin, ändere einfach '' um mytable in ``. Meine Antwort zielt darauf ab, Menschen mit diesem Problem zu helfen. Denken Sie daran, Ihre Ablehnung zu überdenken.
helpse
1

Wenn mysql.proc leer ist, das System jedoch immer feststellt, dass "[email protected].%" für tabellenname nicht vorhanden ist, rooten Sie einfach in der mysql-Befehlszeile und geben Folgendes ein:

CHECK TABLE `database`.`table_name` QUICK FAST MEDIUM CHANGED;
flush privileges;

Über!

zhi.yang
quelle
1

Dies geschah mir, nachdem ich einen Dump unter Windows 10 mit MYSQL Workbench 6.3 Community importiert hatte, mit "root @% existiert nicht". Obwohl der Benutzer existierte. Zuerst habe ich versucht, den DEFINER zu kommentieren, aber das hat nicht funktioniert. Ich habe dann einen String für "root @%" durch "root @ localhost" ersetzt und den Dump erneut importiert. Das hat den Trick für mich getan.

Dévan Coetzee
quelle
0

Der Datenbankbenutzer scheint auch zwischen Groß- und Kleinschreibung zu unterscheiden. Während ich einen Root-Benutzer '@'% hatte, hatte ich keinen ROOT-Benutzer '@'%. Ich habe den Benutzer über die Workbench in Großbuchstaben geändert und das Problem wurde behoben!

Metalmania
quelle