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?
mysql
permissions
Tech MLG
quelle
quelle
view_quotes
.Antworten:
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
DEFINER
Anweisungen aus dem Speicherauszug entfernen .Das spätere Ändern des Definierers ist etwas schwieriger:
So ändern Sie den Definierer für Ansichten
Führen Sie diese SQL aus, um die erforderlichen ALTER-Anweisungen zu generieren
Kopieren Sie die ALTER-Anweisungen und führen Sie sie aus
So ändern Sie den Definierer für gespeicherte Prozeduren
Beispiel:
Seien Sie vorsichtig, da dadurch alle Definierer für alle Datenbanken geändert werden.
2. Erstellen Sie den fehlenden Benutzer
Von http://www.lynnnayko.com/2010/07/mysql-user-specified-as-definer-root.html
Dies funktionierte wie ein Zauber - Sie müssen nur
someuser
den Namen des vermissten Benutzers ändern . Auf einem lokalen Entwicklungsserver verwenden Sie normalerweise nurroot
.Überlegen Sie auch, ob Sie den Benutzern tatsächlich
ALL
Berechtigungen erteilen müssen oder ob sie mit weniger auskommen könnten.quelle
mysql
.proc
P SET definer = 'user @%' WHERE definer = 'root @%'" hinzuzufügen und neu zu starten, da die Definierer der Prozeduren erst dann aktualisiert werden.DEFINER=`user`@`host`
und erneut importiert. Lief wie am Schnürchen. : ok_hand: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.
quelle
SELECT
und gewährenEXECUTE
. 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.DROP
angezeigt (und dann erneutCREATE
) werden.UPDATE mysql.proc SET definer = 'my_new_user@localhost' WHERE db = 'mydatatbase';
GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password'; FLUSH PRIVILEGES;
Ich habe den gleichen Fehler nach dem Aktualisieren von MySQL.
Der Fehler wurde nach diesem Befehl behoben:
quelle
Wenn der Benutzer existiert, dann:
quelle
Erstellen Sie den gelöschten Benutzer folgendermaßen:
oder
quelle
ERROR 1142 (42000): TRIGGER command denied to user 'web2vi'@'%' for table 'foo'
und sollte diesen Befehlgrant all on *.* to 'web2vi'@'%' identified by ''
nach dem Erstellen des Benutzers hinzufügenFolge diesen Schritten:
Ich hoffe es hilft
quelle
Die Lösung ist nur eine einzeilige Abfrage wie folgt:
Ersetzen Sie
ROOT
durch Ihren MySQL-Benutzernamen. Ersetzen SiePASSWORD
durch Ihr MySQL-Passwort.quelle
flush privileges
danach und es funktioniert. Vielen Dank.Behoben durch Ausführen der folgenden Kommentare.
Wenn Sie
some_other
stattdessen bekommenweb2vi
, müssen Sie den Namen entsprechend ändern.quelle
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.
quelle
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).
quelle
Schnelle Lösung, um die Datei zu umgehen und zu sichern:
quelle
--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.Beispiel:
quelle
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.
quelle
Ich hatte das gleiche Problem mit dem Root-Benutzer und es funktionierte bei mir, als ich es ersetzte
durch
Wenn der Benutzer 'web2vi' von 'localhost' aus eine Verbindung herstellen darf, können Sie Folgendes versuchen:
Ich bin remote mit der Datenbank verbunden.
quelle
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.
quelle
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:
Mischen Sie dies mit der MySQL-Befehlszeile (vorausgesetzt * nix, nicht vertraut mit Windows):
Hinweis: Der Befehl generiert ein zusätzliches SELECT CONCAT für die Datei und schlägt
mysql -uuser -ppass databasename < alterView.sql
fehl, wenn Sie es nicht entfernen.Quelle: /dba/4129/modify-definer-on-many-views
quelle
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.
quelle
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).
quelle
In meinem Fall hatte die Tabelle einen Trigger mit einem DEFINER-Benutzer, der nicht vorhanden war.
quelle
Aus der MySQL-Referenz von
CREATE VIEW
: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.
quelle
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.
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.
quelle
Sie können dies versuchen:
quelle
Ich habe eine Stunde zuvor eine Entscheidung für ein solches Problem gefunden. Aber in meinem Fall habe ich Folgendes ausgeführt:
Wenn Sie das Problem wirklich finden möchten, führen Sie diese Befehle einfach nacheinander aus:
... 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.
quelle
Gehen Sie in den Abschnitt Bearbeitungsroutine und ändern Sie unten den Sicherheitstyp von Definer in Invoker.
quelle
Eine oder mehrere Ihrer Ansichten wurden von einem anderen Benutzer erstellt / registriert. Sie müssen den Eigentümer der Ansicht überprüfen und:
'web2vi'
mit ALTER VIEW neuIch 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.
quelle
Wenn dies eine gespeicherte Prozedur ist, können Sie Folgendes tun:
Dies wird jedoch nicht empfohlen.
Für mich ist es eine bessere Lösung, den Definierer zu erstellen:
quelle
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:
Über!
quelle
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.
quelle
Versuchen Sie dies Dies ist eine einfache Lösung
Weitere Informationen finden Sie unter https://stackoverflow.com/a/42183702/5407056
quelle
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!
quelle