Erreur MySQL 1449: l'utilisateur spécifié comme un definer n'existe pas

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 j'ai cette erreur? Comment puis-je résoudre ce problème?

244
demandé sur dronus 2012-04-16 11:08:05

30 réponses

cela se produit souvent lorsque l'on exporte des vues/déclencheurs/procédures d'une base de données ou d'un serveur à une autre, car l'utilisateur qui a créé cet objet n'existe plus.

vous avez deux options:

1. Changer la définition

ceci est probablement le plus facile à faire lors de l'importation initiale de vos objets de base de données, en supprimant toute instruction DEFINER du dump.

changer la définition plus tard est un plus peu délicat:

Comment changer le definer pour les vues

  1. Exécuter le SQL pour générer les instructions ALTER

    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 lancez les ALTER statements

Comment changer le definer pour les procédures stockées

exemple:

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

soyez prudent, parce que cela va changer tous les definers pour toutes les bases de données.

2. Créer l'utilisateur manquant

si vous avez trouvé l'erreur suivante en utilisant la base de données MySQL:

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

alors vous pouvez résoudre en utilisant le texte suivant :

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

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

Cela a fonctionné comme un charme - vous n'avez qu'à changer someuser le nom de l'utilisateur manquant. Sur un serveur dev local, vous pouvez typiquement utiliser root .

également examiner si vous devez réellement accorder à l'utilisateur ALL des permissions ou s'ils pourraient faire avec moins.

362
répondu Chococroc 2017-07-02 20:32:54

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

125
répondu Dave Z Dopson 2016-03-16 01:21:23

Si l'utilisateur existe, alors:

mysql> flush privileges;
31
répondu BroknDodge 2013-01-09 21:24:46

créer l'utilisateur supprimé comme suit:

mysql> create user 'web2vi';

ou

mysql> create user 'web2vi'@'%';
25
répondu Kevin 2014-05-18 12:44:58

suivez ces étapes:

  1. Aller à PHPMyAdmin
  2. Sélectionnez Votre Base De Données
  3. Sélectionnez votre table
  4. dans le menu du haut cliquez sur "Triggers "
  5. cliquez sur "Modifier" pour modifier la commande
  6. changer la définition de [user@localhost] en root@localhost

j'Espère que ça aide

14
répondu hussainfrotan 2016-03-01 05:00:41

Solution est juste une requête en ligne simple comme ci-dessous:

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

remplacer ROOT par votre nom d'utilisateur mysql. Remplacer PASSWORD par votre mot de passe mysql.

14
répondu Muhammad Azeem 2017-05-15 10:49:21

j'ai eu la même erreur après avoir mis mysql à jour.

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

mysql_upgrade -u root

mysql_upgrade doit être exécuté chaque fois que vous mettez à jour MySQL. Il vérifie toutes les tables dans toutes les bases de données pour les incompatibilités avec le version actuelle du serveur MySQL. Si une table est trouvée pour avoir un incompatibilité possible, il est vérifié. Si des problèmes sont détectés, la table est réparée. mysql_upgrade aussi mise à niveau des tables système afin que vous puissiez profiter de nouveaux privilèges ou capacités qui peuvent avoir été ajoutés.

14
répondu artamonovdev 2018-07-23 20:06:55

pour les futurs googleurs: j'ai reçu un message similaire essayant de mettre à jour une table dans une base de données qui ne contenait pas de vues. 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 non-existant. Déposer les déclencheurs résolu le problème.

13
répondu Chris Poirier 2014-11-27 07:31:52

corrigé en exécutant les commentaires suivants.

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

si vous recevez some_other au lieu de web2vi alors vous devez changer le nom en conséquence.

9
répondu Selvamani 2016-01-27 19:23:58

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 comme web2vi@% (à n'importe quoi)

6
répondu cosmorogers 2012-04-16 07:27:28

solution rapide pour contourner et vider le fichier:

mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql
6
répondu Developer 2016-01-11 11:17:06

mes 5 cents.

j'ai eu la même erreur alors que j'ai essayé de sélectionner à partir d'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 de la sauvegarde de serveur différent.

et en fait, oui, l'utilisateur était invalide, mais n'était pas évident où à partir du premier regard.

4
répondu Nick 2013-08-23 06:20:41

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

root@%

par

root@localhost

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

web2vi@localhost

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

4
répondu c-toesca 2013-10-09 18:59:35

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

Mysql par défaut définit les procédures de sécurité "DÉFINISSEUR" (CRÉATEUR DE).. vous devez définir la sécurité à la "invocateur".

4
répondu Allan Felipe Murara 2015-04-28 13:16:03

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

3
répondu jbaylina 2015-02-25 07:41:04
grant all on *.* to 'username'@'%' identified by 'password' with grant option;

exemple:

grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;
3
répondu mesutpiskin 2017-05-22 16:32:44

Votre point de vue, "view_quotes" peut avoir été copié à partir 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.

Soit ajouter l'utilisateur "web2vi" à la base de données, soit modifier la vue (normalement supprimer la partie DEFINER='web2vi'@'%' et exécuter le script fera l'affaire)

2
répondu user1016736 2013-07-31 15:32:48

Vous pouvez essayer ceci:

$ mysql -u root -p 
> grant all privileges on *.* to `root`@`%` identified by 'password'; 
> flush privileges;
2
répondu SBarli 2015-07-23 20:13:17

à Partir de de référence MySQL de CREATE VIEW :

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

Cet utilisateur doit exister et il est toujours préférable d'utiliser "localhost" comme nom d'hôte. Donc je pense que si vous vérifiez que l'utilisateur existe et le changez en 'localhost' sur create view vous n'aurez pas cette erreur.

1
répondu jordeu 2012-04-16 07:28:54

allez dans la section Modifier la routine et en bas, changez le Type de sécurité de Definer à Invoker.

1
répondu user1174436 2012-04-30 19:00:35

le problème est clair - MySQL ne peut pas trouver l'utilisateur spécifié comme le definer.

j'ai rencontré ce problème après avoir synchronisé le modèle de base de données du serveur de développement, l'avoir appliqué à localhost, avoir fait des changements au Modèle et l'avoir ensuite réutilisé pour localhost. Apparemment il y avait une vue (j'ai modifié) définie et donc je ne pouvais pas mettre à jour ma version locale.

comment fixer (facilement) :

Note: il implique la suppression de sorte qu'il fonctionne très bien pour les vues, mais assurez-vous que vous avez des données sauvegardées si vous essayez cela sur les tables.

  1. Se connecter à la base de données en tant que root (ou ce qui a assez de pouvoir pour faire des changements).
  2. Supprimer vue, table ou ce que vous avez des problèmes avec.
  3. Synchronisez votre nouveau modèle - il ne se plaindra pas de quelque chose qui n'existe pas maintenant. Vous pouvez voulez supprimer SQL SECURITY DEFINER partie de la définition de l'article que vous avez eu des problèmes avec.

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

1
répondu Pijusn 2012-12-25 15:04:53

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 non utilisé de mysql.table d'utilisateur, mais faire une alter view l'a corrigé, voici une commande pratique qui la 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 ceci avec la ligne de commande mysql (en supposant *nix, pas familier avec windows):

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

Note: la commande génère et extra sélectionnez CONCAT sur le fichier, faisant échouer mysql -uuser -ppass databasename < alterView.sql si vous ne le supprimez pas.

Source: https://dba.stackexchange.com/questions/4129/modify-definer-on-many-views

1
répondu Ziul 2017-04-13 12:42:42

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

  1. recréer l'utilisateur; comme le disent les autres réponses. ou
  2. recréer les vues qui ont été créées par l'utilisateur 'web2vi' en utilisant modifier la vue

j'ai eu ce problème une fois.

j'essayais de migrer les vues, de BD1 à BD2, en utilisant SQLYog. SQLYog a recréé les vues dans L'autre base de données (DB2), mais il a gardé L'utilisateur de BD1 (ils où différent). 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 si je ne créais aucune vue.

Espérons que cette aide.

1
répondu Julio Indriago 2014-02-02 14:16:58

si c'est une procédure stockée, vous pouvez faire:

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

Mais ce n'est pas conseillé.

pour moi, une meilleure solution est de créer le definer:

create user 'myuser' identified by 'mypass';
grant all on `mytable`.* to 'myuser' identified by 'mypass';
1
répondu helpse 2014-07-09 21:15:40

quand mysql.proc est vide, mais le système le remarque toujours "user@192.168.%" pour table_name n'existe pas,vous venez de racine dans mysql en ligne de commande et tapez:

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

plus de!

1
répondu zhi.yang 2015-09-14 09:38:48

pourquoi j'ai cette erreur? Comment puis-je résoudre ce problème?

j'ai passé une heure avant de trouvé 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 cette commande une à une:

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

...et, après chaque d'entre eux, recherchez le champ "définisseur'.

dans mon cas, il était vieux gâchette barbue, que quelqu'un de développeurs oublié de supprimer.

1
répondu kivagant 2015-12-02 15:27:20

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

1
répondu Dévan Coetzee 2016-12-05 06:51:21

l'utilisateur de la base de données semble aussi sensible à la casse, donc même si j'avais un utilisateur root'@'% Je n'avais pas D'utilisateur ROOT'@'%. J'ai changé l'utilisateur pour être en majuscules via workbench et le problème a été résolu!

0
répondu Metalmania 2015-05-14 12:33:18

dans mon cas j'avais un déclencheur sur cette table que je ne pouvais pas mettre à jour les données obtenant la même erreur.

erreur MySQL 1449: l'utilisateur spécifié comme un definer n'existe pas

la solution était de supprimer les déclencheurs sur cette table et de les recréer à nouveau, ce qui a réglé le problème, puisque le déclencheur a été fait avec un autre utilisateur d'un autre serveur, et le nom de l'Utilisateur a changé sur le nouveau serveur après avoir changé l'hébergement entreprise. c'est mon 2 cents

0
répondu Nassim 2015-12-07 15:16:29

je suis venu ici pour le même problème, Je ne pouvais trouver nulle part dans mon code où un certain utilisateur faisait l'action. apparemment, il était d'un déclencheur qui utilisait un utilisateur qui a été longtemps supprimé (db a été restauré à partir d'une version plus ancienne) donc, au cas où vous êtes intrigué comme je l'étais, jetez un oeil à vos événements db/triggers/routines. espérons que cela aidera quelqu'un.

0
répondu Dan Levin 2016-01-25 14:17:18