Erreur MySQL 1449: l'utilisateur spécifié comme définisseur n'existe pas

354

Lorsque j'exécute la requête suivante, j'obtiens une erreur:

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

Le message d'erreur est:

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

Pourquoi ai-je cette erreur? Comment je le répare?

Tech MLG
la source
7
Montrez-nous votre SHOW CREATE VIEW 'view_quotes'
jordeu
L'erreur doit se trouver dans la condition de view_quotesvue.
Shell
Après y avoir réfléchi un instant et la solution la plus simple a été d'ajouter le compte manquant à la base de données et l'erreur a disparu. Aucune procédure compliquée n'est nécessaire. Si vous pouvez ajouter le compte, essayez d'abord.
user1794918

Réponses:

540

Cela se produit généralement lors de l'exportation de vues / déclencheurs / procédures d'une base de données ou d'un serveur vers un autre, car l'utilisateur qui a créé cet objet n'existe plus.

Vous avez deux options:

1. Changez le DEFINER

C'est probablement plus facile à faire lors de l'importation initiale de vos objets de base de données, en supprimant toutes les DEFINERinstructions du vidage.

Changer le définisseur plus tard est un peu plus délicat:

Comment changer le définisseur pour les vues

  1. Exécutez ce SQL pour générer les instructions ALTER nécessaires

    SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ", 
    table_name, " AS ", view_definition, ";") 
    FROM information_schema.views 
    WHERE table_schema='your-database-name';
  2. Copiez et exécutez les instructions ALTER

Comment changer le définisseur pour les procédures stockées

Exemple:

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

Soyez prudent, car cela changera tous les définisseurs pour toutes les bases de données.

2. Créez l'utilisateur manquant

Si vous avez trouvé l'erreur suivante lors de l'utilisation de la base de données MySQL:

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

Ensuite, vous pouvez le résoudre en utilisant ce qui suit:

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

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

Cela a fonctionné comme un charme - vous n'avez qu'à changer someuserle nom de l'utilisateur manquant. Sur un serveur de développement local, vous pouvez généralement simplement utiliser root.

Demandez-vous également si vous devez réellement accorder des ALLautorisations aux utilisateurs ou s'ils pourraient en faire moins.

Chococroc
la source
1
. et l'option d'octroi ne sont pas nécessaires.
helpse
@Simon East: Vous avez fait une belle retouche, merci beaucoup d'avoir tellement amélioré la réponse.
Chococroc
Je suggère d'ajouter, de redémarrer l'instance mySQL après avoir exécuté la requête "UPDATE mysql. procP SET definer = 'user @%' WHERE definer = 'root @%'" car les définisseurs des procédures ne sont alors actualisés que.
johan
1
Je pense qu'il est plus facile d'ajouter des utilisateurs dépourvus de sens, car la prochaine fois que vous effectuez un dbdump et l'importez, vous n'aurez pas besoin de refaire l'édition des vues / procédures
DarkMukke
1
Merci, je viens de supprimer la table avec le problème, de la supprimer DEFINER=`user`@`host`et de la réimporter. A fonctionné comme un charme. : ok_hand:
giovannipds
139

L'utilisateur qui a initialement créé la vue ou la procédure SQL a été supprimé. Si vous recréez cet utilisateur, il devrait corriger votre erreur.

Dave Z Dopson
la source
3
De plus, vous devrez accorder au moins les privilèges SELECTet EXECUTEà l'utilisateur ajouté. J'ai rencontré cela lorsque j'ai exporté une sauvegarde de base de données d'un serveur vers un autre où l'utilisateur qui a créé les routines n'existait pas sur le serveur de test.
drew010
5
Merci, cela a été utile. Souvent, lors de la migration ou du déploiement à l'aide de mysqldump, l'utilisateur qui a créé VIEW, TRIGGER ou PROCEDURE (le définisseur) peut ne pas être le même sur le système cible. Dans ce cas, il suffit de recréer la procédure, de déclencher ou d'afficher ( DROPpuis de ré CREATE-utiliser) un utilisateur valide sur le système cible.
Eric Kigathi
38
vous pouvez également changer qui est le définisseur en un utilisateur existant:UPDATE mysql.proc SET definer = 'my_new_user@localhost' WHERE db = 'mydatatbase';
1
Exactement dans mon cas, j'avais une table avec déclencheur qui pointait vers un utilisateur DEFINER qui avait été supprimé. La mise à jour de l'utilisateur déclencheur a résolu le problème.
Miguel
Vous devez également donner la permission à cet utilisateur :) GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password'; FLUSH PRIVILEGES;
Victor
50

J'ai eu la même erreur après la mise à jour de mysql.

L'erreur a été corrigée après cette commande:

mysql_upgrade -u root

mysql_upgrade doit être exécuté à chaque mise à niveau de MySQL. Il vérifie toutes les tables de toutes les bases de données pour les incompatibilités avec la version actuelle de MySQL Server. Si une table présente une incompatibilité possible, elle est vérifiée. En cas de problème, la table est réparée. mysql_upgrade met également à niveau les tables système afin que vous puissiez profiter de nouveaux privilèges ou capacités qui pourraient avoir été ajoutés.

artamonovdev
la source
Je ne sais pas pourquoi cela n'a pas fonctionné pour moi, j'ai dû supprimer manuellement tous les déclencheurs du plan de travail mySQL.
user752746
35

Si l'utilisateur existe, alors:

mysql> flush privileges;
BroknDodge
la source
34

Créez l'utilisateur supprimé comme ceci:

mysql> create user 'web2vi';

ou

mysql> create user 'web2vi'@'%';
Kevin
la source
3
après avoir créé cet utilisateur manqué, a rencontré une autre erreur: ERROR 1142 (42000): TRIGGER command denied to user 'web2vi'@'%' for table 'foo'et devrait ajouter cette commande grant all on *.* to 'web2vi'@'%' identified by ''après avoir créé l'utilisateur
zhuguowei
31

Suivez ces étapes:

  1. Accédez à PHPMyAdmin
  2. Sélectionnez votre base de données
  3. Sélectionnez votre table
  4. Dans le menu supérieur, cliquez sur «Déclencheurs»
  5. Cliquez sur «Modifier» pour modifier le déclencheur
  6. Remplacez le définisseur de [utilisateur @ localhost] par root @ localhost

J'espère que cela aide

hussainfrotan
la source
1
Il s'agit de la solution réelle à la question, plutôt que de créer un utilisateur et d'accorder une autorisation. il suffit de changer le définisseur.
Ankit Chauhan
Existe-t-il un moyen de trouver tous les déclencheurs dans la base de données?
Mrugesh Mistry
1
Trouver tous les déclencheurs: SHOW TRIGGERS
JerzySkalski
Depuis la ligne de commande 'show triggerss', depuis PhpMyAdmin sélectionnez la base de données puis en haut à droite de la barre de navigation cliquez sur les triggers
hussainfrotan
21

La solution est juste une requête sur une seule ligne comme ci-dessous:

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

Remplacez ROOTpar votre nom d'utilisateur mysql. Remplacez PASSWORDpar votre mot de passe mysql.

Muhammad Azeem
la source
1
Attention: les utilisateurs MySQL sont sensibles à la casse.
Alessio Cantarella du
J'en avais besoin flush privilegesaprès ça et ça marche. Merci.
Victor
14

Corrigé en exécutant les commentaires suivants.

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

si vous obtenez some_otherau lieu de web2vialors vous devez changer le nom en conséquence.

Selvamani
la source
13

Pour les futurs googleurs: j'ai reçu un message similaire en essayant de mettre à jour une table dans une base de données qui ne contenait aucune vue. Après quelques recherches, il s'est avéré que j'avais importé des déclencheurs sur cette table, et ce sont les choses définies par l'utilisateur inexistant. La suppression des déclencheurs a résolu le problème.

Chris Poirier
la source
Les déclencheurs étaient le problème, j'ai mis à jour le définisseur dans la section des déclencheurs. plus de problèmes.
Darius
Merci, c'est très utile. Vous devez également mettre à jour les vues.
toxxxa
En effet très utile :) Je ne trouverais jamais ça tout seul.
ElChupacabra
7

L'utilisateur 'web2vi' n'existe pas sur votre serveur mysql.

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

Si cet utilisateur existe, vérifiez à quels serveurs il peut accéder, bien que j'aurais pensé que ce serait une erreur différente (par exemple, vous pourriez avoir web2vi @ localhost, mais vous accédez à la base de données en tant que web2vi @% (à tout)

cosmorogers
la source
7

solution rapide pour contourner et vider le fichier:

mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql
Développeur
la source
1
cela ne fonctionne pas. le définisseur est contenu dans le vidage.
phil294
Si vous utilisez mysqlpump avec un "p" au lieu d'un "d", vous pouvez utiliser --skip-definer
Wouter
@lyhong Je n'ai pas d'explication détaillée, mais --single-transactionmodifie apparemment la façon dont Lock Tables est implémenté lors d'un vidage. Ou quelque chose comme ça. Je ne me souviens pas où je l'ai lu, mais cela m'a aidé à me sentir à l'aise de "simplement lancer le drapeau". Je suis également mal à l'aise avec les «réponses» inexpliquées «faites-le». Quoi qu'il en soit, cela a fonctionné pour mon cas.
SherylHohman
7
grant all on *.* to 'username'@'%' identified by 'password' with grant option;

exemple:

grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;
mesutpiskin
la source
Si j'accorde tous les privilèges à un 'utilisateur' @ 'all ips', alors qu'en est-il de la sécurité ?? !!
Mohsen Abasi le
@MohsenAbasi Ceci est un exemple pour l'environnement de développement. Cet utilisateur peut être l'administrateur système. L'environnement de production doit être plus prudent.
mesutpiskin
7

Cela m'est arrivé après avoir déplacé la base de données d'un serveur vers un autre serveur. Initialement, le définisseur utilisait localhost et l'utilisateur. Sur le nouveau serveur, nous n'avons pas cet utilisateur et l'hôte a également été changé. J'ai pris une sauvegarde de cette table particulière et supprimé manuellement tous les déclencheurs de phpmyadmin . Après cela, cela a bien fonctionné pour moi.

TS Guhan
la source
Merci pour l'astuce, j'ai pu supprimer manuellement tous les déclencheurs du plan de travail mySQL.
user752746
C'était en effet un problème déclencheur pour moi, j'ai dû les supprimer et les recréer tous
paul.ago
existe-t-il une autre solution que de recréer des déclencheurs? j'utilise des tests de vidage parfois deux fois par jour. cela perturberait mes processus principaux
redestructa
@TS Guhan avez-vous rajouté les déclencheurs après les avoir supprimés manuellement?
MailBlade
6

J'ai eu le même problème avec l'utilisateur root et cela a fonctionné pour moi quand j'ai remplacé

root@%

par

root@localhost

Donc, si l'utilisateur 'web2vi' est autorisé à se connecter depuis 'localhost', vous pouvez essayer:

web2vi@localhost

Je suis connecté à distance à la base de données.

c-toesca
la source
4

Mes 5 cents.

J'ai eu la même erreur pendant que j'essayais de sélectionner dans une vue.

Cependant, le problème semble être que cette vue, sélectionnée à partir d'une autre vue qui a été restaurée à partir d'une sauvegarde à partir d'un serveur différent.

et en fait, OUI, l'utilisateur n'était pas valide, mais il n'était pas évident d'où aller au premier regard.

pseudo
la source
4

J'ai eu votre même problème il y a quelques minutes, j'ai rencontré ce problème après avoir supprimé un utilisateur inutilisé de la table mysql.user, mais en effectuant une autre vue, il est résolu, voici une commande pratique qui le rend très simple:

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

Mélangez cela avec la ligne de commande mysql (en supposant que * nix, pas familier avec Windows):

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

Remarque: la commande génère et SELECT CONCAT supplémentaire sur le fichier, faisant mysql -uuser -ppass databasename < alterView.sqléchouer si vous ne le supprimez pas.

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

Ziul
la source
4

Essayez de définir votre procédure comme SECURITY INVOKER

Mysql définit par défaut la sécurité des procédures comme "DEFINER" (CREATEUR DE) .. vous devez définir la sécurité sur "l'invocateur".

Allan Felipe Murara
la source
3

Votre vue, "view_quotes" peut avoir été copiée d'une autre base de données où "web2vi" est un utilisateur valide dans une base de données où "web2vi" n'est pas un utilisateur valide.
Ajoutez l'utilisateur "web2vi" à la base de données ou modifiez la vue (en supprimant normalement la partie DEFINER = 'web2vi' @ '%' et en exécutant le script fera l'affaire)

user1016736
la source
3

Dans mon cas, la table avait un déclencheur avec un utilisateur DEFINER qui n'existait pas.

jbaylina
la source
2
à droite sur l'ongle spécialement lorsque l'application est transférée d'un serveur à un autre
zardilior
2

D'après la référence MySQL de CREATE VIEW:

Les clauses DEFINER et SQL SECURITY spécifient le contexte de sécurité à utiliser lors de la vérification des privilèges d'accès au moment de l'appel de la vue.

Cet utilisateur doit exister et il est toujours préférable d'utiliser «localhost» comme nom d'hôte. Je pense donc que si vous vérifiez que l'utilisateur existe et que vous le changez en «localhost» lors de la création de la vue, vous n'aurez pas cette erreur.

jordeu
la source
2

Le problème est clair - MySQL ne peut pas trouver l'utilisateur spécifié comme définisseur.

J'ai rencontré ce problème après avoir synchronisé le modèle de base de données à partir du serveur de développement, l'avoir appliqué à localhost, apporté des modifications au modèle, puis le réappliquer à localhost. Apparemment, une vue (que j'ai modifiée) a été définie et je n'ai donc pas pu mettre à jour ma version locale.

Comment réparer (facilement) :

Remarque: cela implique la suppression, donc cela fonctionne très bien pour les vues, mais assurez-vous que les données sont sauvegardées si vous essayez cela sur des tables.

  1. Connectez-vous à la base de données en tant que root (ou tout ce qui a suffisamment de puissance pour apporter des modifications).
  2. Supprimez la vue, le tableau ou tout ce qui vous pose problème.
  3. Synchronisez votre nouveau modèle - il ne se plaindra pas de quelque chose qui n'existe pas maintenant. Vous pouvez supprimer la partie SQL SECURITY DEFINER de la définition d'élément avec laquelle vous avez rencontré des problèmes.

PS Ce n'est ni une solution correcte ni la meilleure solution. Je viens de le poster comme une solution possible (et très simple).

Pijusn
la source
j'utilise crapaud, cn je supprime et recrée en utilisant ce seul os dois-je me connecter en tant que rooy à partir du terminal et ensuite ne le faire que ??
Vasanth Nag KV
2

Vous pouvez essayer ceci:

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

Pourquoi ai-je cette erreur? Comment je le répare?

J'ai passé une heure avant de trouver une décision pour un problème comme celui-ci. Mais, dans mon cas, j'ai couru ceci:

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

Si vous voulez vraiment trouver le problème, exécutez simplement ces commandes une par une:

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

... et, après chacun d'eux, recherchez le champ "definer".

Dans mon cas, c'était un vieux déclencheur barbu, que quelqu'un de développeurs avait oublié de supprimer.

kivagant
la source
1

Allez dans la section d'édition de routine et, en bas, changez le type de sécurité de Definer en Invoker.

user1174436
la source
4
Allez où? Dans quel logiciel?
kenorb
@kenorb, dans phpMyAdmin, vous pouvez changer les routines stockées MySQL (procédures et fonctions), par exemple le type de sécurité.
Mikl
1

Une ou plusieurs de vos vues ont été créées / enregistrées par un autre utilisateur. Vous devrez vérifier le propriétaire de la vue et:

  1. Recréez l'utilisateur; comme le disent les autres réponses. ou
  2. Recréez les vues créées par l'utilisateur à l' 'web2vi'aide de ALTER VIEW

J'ai eu ce problème une fois.

J'essayais de migrer des vues, de BD1 à BD2, à l'aide de SQLYog. SQLYog a recréé les vues dans l'autre DataBase (DB2), mais il a conservé l'utilisateur de BD1 (ils étaient différents). Plus tard, j'ai réalisé que les vues que j'utilisais dans ma requête avaient la même erreur que vous, même lorsque je ne créais aucune vue.

J'espère que cette aide.

Julio Indriago
la source
1

S'il s'agit d'une procédure stockée, vous pouvez effectuer:

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

Mais ce n'est pas conseillé.

Pour moi, la meilleure solution est de créer le définisseur:

create user 'myuser' identified by 'mypass';
grant all on `mytable`.* to 'myuser' identified by 'mypass';
helpse
la source
Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser près de 'grant all on' mytable '. * à' myuser 'identifié par' mypass ';' à la ligne 1
Cerin
@Cerin, changez simplement '' autour de mytable en ``. Ma réponse vise à aider les gens avec ce problème .. Pensez à reconsidérer votre downvote ..
helpse
1

lorsque mysql.proc est vide, mais que le système remarque toujours "[email protected].%" pour nom_table n'existe pas, il vous suffit de rooter dans la ligne de commande mysql et de taper:

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

plus de!

zhi.yang
la source
1

Cela m'est arrivé après avoir importé un vidage sur Windows 10 avec la communauté MYSQL Workbench 6.3, avec "root @% n'existe pas". Même si l'utilisateur existait. J'ai d'abord essayé de commenter le DEFINER mais cela n'a pas fonctionné. J'ai ensuite remplacé une chaîne sur "root @%" par "root @ localhost" et j'ai réimporté le vidage. Cela a fait l'affaire pour moi.

Dévan Coetzee
la source
0

L'utilisateur de la base de données semble également être sensible à la casse, donc même si j'avais un utilisateur racine '@'%, je n'avais pas d'utilisateur ROOT '@'%. J'ai changé l'utilisateur pour qu'il soit en majuscules via le plan de travail et le problème a été résolu!

Metalmania
la source