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?


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.


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.


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.


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


34

Erstellen Sie den gelöschten Benutzer folgendermaßen:

mysql> create user 'web2vi';

oder

mysql> create user 'web2vi'@'%';

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


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.


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.


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.


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

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

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;

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.


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.


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.


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


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.


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


3

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


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.


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.


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;

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.


1

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


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.


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

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 "user@192.168.%" 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!


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.



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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.