Errore MySQL 1449: l'utente specificato come definitore non esiste


353

Quando eseguo la seguente query ottengo un errore:

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

Il messaggio di errore è:

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

Perché ricevo questo errore? Come lo aggiusto?


7
Mostraci il tuo SHOW CREATE VIEW 'view_quotes'
jordeu,

L'errore deve trovarsi nella condizione di view_quotesvisualizzazione.
Shell,

Dopo aver pensato a questo un momento e il modo più semplice di agire è stato quello di aggiungere l'account mancante al database e l'errore è scomparso. Nessuna procedura complicata necessaria. Se puoi aggiungere l'account, prova prima quello.
user1794918

Risposte:


540

Ciò si verifica comunemente quando si esportano viste / trigger / procedure da un database o un server a un altro poiché l'utente che ha creato quell'oggetto non esiste più.

Hai due opzioni:

1. Cambia DEFINER

Questo è probabilmente il più facile da fare quando si importano inizialmente gli oggetti del database, rimuovendo tutte le DEFINERistruzioni dal dump.

Cambiare il definitore in seguito è un po 'più complicato:

Come modificare il definitore per le viste

  1. Esegui questo SQL per generare le istruzioni ALTER necessarie

    SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ", 
    table_name, " AS ", view_definition, ";") 
    FROM information_schema.views 
    WHERE table_schema='your-database-name';
  2. Copia ed esegui le istruzioni ALTER

Come modificare il definitore per le procedure memorizzate

Esempio:

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

Fai attenzione, perché questo cambierà tutti i definitori per tutti i database.

2. Creare l'utente mancante

Se hai trovato il seguente errore durante l'utilizzo del database MySQL:

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

Quindi puoi risolverlo usando il seguente:

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

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

Funzionava come un incantesimo: devi solo cambiare someuseril nome dell'utente mancante. Su un server di sviluppo locale, in genere potresti semplicemente usare root.

Considera anche se devi effettivamente concedere le ALLautorizzazioni utente o se potrebbero fare con meno.


1
. e l'opzione di concessione non sono richieste.
helpse il

@Simon East: hai fatto un bel montaggio, grazie mille per aver migliorato così tanto la risposta.
Chococroc,

Suggerisco di aggiungere, riavviare l'istanza mySQL dopo aver eseguito la query "UPDATE mysql. procP SET definer = 'user @%' WHERE definer = 'root @%'" poiché i definitori delle procedure vengono aggiornati solo allora.
johan,

1
Penso che sia più facile aggiungere utenti senza senso, perché la prossima volta che esegui un dbdump e lo importi, non dovrai più modificare le viste / procedure
DarkMukke,

1
Grazie, ho appena abbandonato la tabella con il problema, rimosso DEFINER=`user`@`host`e reimportato. Ha funzionato come un fascino. : ok_hand:
giovannipds

139

L'utente che ha originariamente creato la vista o la procedura SQL è stato eliminato. Se ricrea quell'utente, dovrebbe risolvere il tuo errore.


3
Inoltre, dovrai concedere almeno i privilegi SELECTe EXECUTEall'utente aggiunto. Mi sono imbattuto in questo quando ho esportato un backup DB da un server a un altro in cui l'utente che ha creato le routine non esisteva sul server di prova.
drew010,

5
Grazie, questo è stato utile. Spesso, durante la migrazione o la distribuzione tramite mysqldump, l'utente che ha creato VIEW, TRIGGER o PROCEDURE (il definitore) potrebbe non essere lo stesso sul sistema di destinazione. In tal caso, basta ricreare la procedura, attivare o visualizzare ( DROPquindi ri CREATE) utilizzare un utente valido sul sistema di destinazione.
Eric Kigathi,

38
puoi anche cambiare chi è il definitore per un utente esistente:UPDATE mysql.proc SET definer = 'my_new_user@localhost' WHERE db = 'mydatatbase';

1
Esattamente nel mio caso avevo una tabella con trigger che puntava a un utente DEFINER che era stato eliminato. L'aggiornamento dell'utente del trigger ha risolto il problema.
Miguel,

Devi anche dare il permesso a quell'utente :) GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password'; FLUSH PRIVILEGES;
Victor,

50

Ho avuto lo stesso errore dopo aver aggiornato mysql.

L'errore è stato corretto dopo questo comando:

mysql_upgrade -u root

mysql_upgrade dovrebbe essere eseguito ogni volta che si aggiorna MySQL. Controlla tutte le tabelle in tutti i database per incompatibilità con la versione corrente di MySQL Server. Se viene rilevata una possibile incompatibilità, una tabella viene verificata. Se si riscontrano problemi, la tabella viene riparata. mysql_upgrade aggiorna anche le tabelle di sistema in modo da poter sfruttare i nuovi privilegi o funzionalità che potrebbero essere stati aggiunti.


Non sono sicuro del motivo per cui questo non ha funzionato per me, ho dovuto rimuovere manualmente tutti i trigger nel workbench mySQL.
user752746


34

Crea l'utente cancellato in questo modo:

mysql> create user 'web2vi';

o

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

3
dopo aver creato quell'utente mancato, si è verificato un altro errore: ERROR 1142 (42000): TRIGGER command denied to user 'web2vi'@'%' for table 'foo'e dovrebbe aggiungere questo comando grant all on *.* to 'web2vi'@'%' identified by ''dopo aver creato l'utente
zhuguowei

31

Segui questi passi:

  1. Vai a PHPMyAdmin
  2. Seleziona il tuo database
  3. Seleziona il tuo tavolo
  4. Nel menu in alto, fai clic su "Trigger"
  5. Fai clic su "Modifica" per modificare il trigger
  6. Cambia definitore da [utente @ localhost] a root @ localhost

Spero che sia d'aiuto


1
Questa è la soluzione effettiva alla domanda, piuttosto che creare l'utente e concedere l'autorizzazione. basta cambiare il definitore.
Ankit Chauhan,

C'è un modo per trovare tutti i trigger nel database?
Mrugesh Mistry,

1
Trova tutti i trigger: SHOW TRIGGERS
JerzySkalski l'

Dalla riga di comando "mostra i trigger", da PhpMyAdmin selezionare il database e quindi in alto a destra nella barra di navigazione fare clic sui trigger
hussainfrotan

21

La soluzione è solo una query a riga singola come di seguito:

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

Sostituisci ROOTcon il tuo nome utente mysql. Sostituisci PASSWORDcon la tua password mysql.


1
Fai attenzione: gli utenti MySQL fanno distinzione tra maiuscole e minuscole.
Alessio Cantarella,

Ho dovuto farlo flush privilegesdopo e funziona. Grazie.
Victor

14

Risolto eseguendo i seguenti commenti.

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

se stai ricevendo some_otherinvece di web2viallora devi cambiare il nome di conseguenza.


13

Per futuri googler: ho ricevuto un messaggio simile nel tentativo di aggiornare una tabella in un database che non conteneva visualizzazioni. Dopo alcuni scavi, ho scoperto che avevo importato i trigger su quella tabella, e quelle erano le cose definite dall'utente inesistente. La caduta dei trigger ha risolto il problema.


Trigger era il problema, ho aggiornato il definitore nella sezione trigger. niente più problemi.
Dario il

Grazie, è molto utile Inoltre, è necessario aggiornare le visualizzazioni.
toxxxa,

Davvero molto utile :) Non lo troverei mai da solo.
ElChupacabra,


7

soluzione rapida per aggirare e scaricare il file:

mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql

1
questo non funziona. il definitore è contenuto nel dump.
phil294,

Se usi mysqlpump con una "p" invece di una "d", puoi usare --skip-definer
Wouter

@lyhong Non ho una spiegazione dettagliata, ma apparentemente --single-transactioncambia il modo in cui Lock Tables viene implementato durante un dump. O qualcosa di simile. Non ricordo dove l'ho letto, ma questo mi ha aiutato a sentirmi a mio agio con "solo lanciando la bandiera". Sono anche a disagio con le "risposte" inspiegabili "basta fare questo". Ad ogni modo, ha funzionato per il mio caso.
SherylHohman,

7
grant all on *.* to 'username'@'%' identified by 'password' with grant option;

esempio:

grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;

Se concedo tutti i privilegi a un 'utente' @ 'all ips', allora che dire della sicurezza ?? !!
Mohsen Abasi,

@MohsenAbasi Questo è un esempio per l'ambiente di sviluppo. Questo utente può essere l'amministratore di sistema. L'ambiente di produzione deve essere più attento.
mesutpiskin,

7

Questo mi è successo dopo aver spostato il DB da un server a un altro server. Inizialmente, il definitore utilizzava localhost e l'utente. Sul nuovo server non abbiamo quell'utente e anche l'host è stato modificato. Ho fatto un backup di quel particolare tavolo e rimosso manualmente tutti i trigger da phpmyadmin . Dopo di che ha funzionato bene per me.


Grazie per il suggerimento, sono stato in grado di rimuovere manualmente tutti i trigger nel workbench mySQL.
user752746

Questo è stato davvero un problema scatenante per me, ho dovuto rimuoverli e ricrearli tutti
paul.ago,

c'è qualche altra soluzione che ricreare i trigger? sto usando discariche di prova a volte due volte al giorno. questo interromperebbe i miei processi principali
redestructa il

@TS Guhan hai aggiunto nuovamente i trigger dopo averli rimossi manualmente?
MailBlade l'

6

Ho avuto lo stesso problema con l'utente root e ha funzionato per me quando ho sostituito

root@%

di

root@localhost

Quindi, se l'utente "web2vi" è autorizzato a connettersi da "localhost", puoi provare:

web2vi@localhost

Sono connesso in remoto al database.


4

I miei 5 centesimi.

Ho avuto lo stesso errore mentre provavo a selezionare da una vista.

Tuttavia, il problema sembra essere questa vista, selezionata da un'altra vista che è stata ripristinata dal backup da un server diverso.

e in effetti, SÌ, l'utente non era valido, ma non era ovvio da dove partire a prima vista.


4

Ho avuto il tuo stesso problema pochi minuti fa, mi sono imbattuto in questo problema dopo aver eliminato un utente inutilizzato dalla tabella mysql.user, ma facendo una modifica della vista è stato risolto, ecco un pratico comando che lo rende molto semplice:

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

Mescola questo con la riga di comando mysql (supponendo * nix, che non ha familiarità con Windows):

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

Nota: il comando genera un ulteriore SELECT CONCAT sul file, fallendo mysql -uuser -ppass databasename < alterView.sqlse non lo si rimuove.

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


4

Prova a impostare la procedura come SECURITY INVOKER

Mysql imposta la sicurezza delle procedure su "DEFINER" (CREATOR OF) .. è necessario impostare la sicurezza su "invoker".


3

La tua vista, "view_quotes" potrebbe essere stata copiata da un database diverso in cui "web2vi" è un utente valido in un database in cui "web2vi" non è un utente valido.
O aggiungi l'utente "web2vi" al database o modifica la vista (rimuovendo normalmente la parte DEFINER = 'web2vi' @ '%' ed eseguendo lo script farà il trucco)


3

Nel mio caso, la tabella aveva un trigger con un utente DEFINER che non esisteva.


2
proprio sull'unghia specialmente quando l'app viene trasferita da un server a un altro
zardilior

2

Da riferimento MySQL di CREATE VIEW:

Le clausole DEFINER e SQL SECURITY specificano il contesto di sicurezza da utilizzare quando si controllano i privilegi di accesso al momento dell'invocazione della vista.

Questo utente deve esistere ed è sempre meglio usare "localhost" come nome host. Quindi penso che se controlli che l'utente esiste e lo cambi in 'localhost' nella vista di creazione non avrai questo errore.


2

Il problema è chiaro: MySQL non riesce a trovare l'utente specificato come definitore.

Ho riscontrato questo problema dopo aver sincronizzato il modello di database dal server di sviluppo, applicandolo a localhost, apportando modifiche al modello e quindi riapplicandolo a localhost. Apparentemente c'era una vista (ho modificato) definita e quindi non ho potuto aggiornare la mia versione locale.

Come risolvere (facilmente) :

Nota: comporta l'eliminazione, quindi funziona bene per le viste, ma assicurati di avere il backup dei dati se provi questo sulle tabelle.

  1. Accedi al database come root (o qualunque cosa abbia abbastanza potenza per apportare modifiche).
  2. Elimina vista, tabella o qualsiasi altra cosa tu abbia problemi.
  3. Sincronizza il tuo nuovo modello: non si lamenterà di qualcosa che non esiste ora. È possibile che si desideri rimuovere la parte SQL SECURITY DEFINER dalla definizione dell'elemento con cui si sono verificati problemi.

PS Questa non è una soluzione corretta né la migliore. L'ho appena pubblicato come una possibile (e molto semplice) soluzione.


sto usando il rospo, cn elimino e ricrea usando quel solo sistema operativo dovrei accedere come rooy dal terminale e poi fare solo ??
Vasanth Nag KV,

2

Puoi provare questo:

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

2

Perché ricevo questo errore? Come lo aggiusto?

Ho trascorso un'ora prima di trovare una decisione per un problema come questo. Ma, nel mio caso, ho eseguito questo:

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

Se vuoi davvero trovare il problema, esegui questi comandi uno alla volta:

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

... e, dopo ognuno di essi, cerca il campo "definitore".

Nel mio caso è stato il vecchio grilletto barbuto, che qualcuno degli sviluppatori ha dimenticato di eliminare.


1

Vai nella sezione di modifica della routine e, in fondo, cambia il tipo di sicurezza da Definer a Invoker.


4
Vai dove? In quale software?
Kenorb,

@kenorb, in phpMyAdmin è possibile modificare le routine memorizzate MySQL (procedure e funzioni), ad es. Tipo di sicurezza.
Mikl,

1

Una o più visualizzazioni sono state create / registrate da un altro utente. Dovrai controllare il proprietario della vista e:

  1. Ricreare l'utente; come dicono le altre risposte. o
  2. Ricrea le viste create dall'utente 'web2vi'tramite ALTER VIEW

Ho avuto questo problema una volta.

Stavo cercando di migrare le viste, da BD1 a BD2, usando SQLYog. SQLYog ha ricreato le viste nell'altro DataBase (DB2), ma ha mantenuto l'utente di BD1 (dove erano diversi). In seguito mi sono reso conto che le viste che stavo usando nella mia query avevano lo stesso errore di te, anche quando non stavo creando alcuna vista.

Spero che questo aiuto.


1

Se questa è una procedura memorizzata, puoi fare:

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

Ma questo non è consigliato.

Per me, la soluzione migliore è creare il definitore:

create user 'myuser' identified by 'mypass';
grant all on `mytable`.* to 'myuser' identified by 'mypass';

Si è verificato un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino a 'grant all on' mytable '. * a' myuser 'identificato da' mypass ';' alla linea 1
Cerin,

@Cerin, basta cambiare '' attorno a mytable in ``. La mia risposta ha lo scopo di aiutare le persone con questo problema .. Pensa a riconsiderare il tuo downvote ..
helpse

1

quando mysql.proc è vuoto, ma il sistema nota sempre "user@192.168.%" per table_name non esiste, fai il root nella riga di comando mysql e digita:

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

al di sopra di!


1

Questo mi è successo dopo aver importato un dump su Windows 10 con MYSQL Workbench 6.3 Community, con "root @% non esiste". Anche se l'utente esisteva. Per prima cosa ho provato a commentare DEFINER, ma questo non ha funzionato. Ho quindi sostituito una stringa su "root @%" con "root @ localhost" e ho reimportato il dump. Questo ha fatto il trucco per me.



0

Anche l'utente del database sembra fare distinzione tra maiuscole e minuscole, quindi mentre avevo un utente root '@'% non avevo un utente ROOT '@'%. Ho modificato l'utente in maiuscolo tramite workbench e il problema è stato risolto!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.