437 votes

Erreur MySQL 1449 : l'utilisateur spécifié comme définisseur 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 le suivant :

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

Pourquoi est-ce que je reçois cette erreur ? Comment puis-je la corriger ?

8 votes

Montrez-nous votre SHOW CREATE VIEW 'view_quotes'.

0 votes

L'erreur doit être dans l'état où se trouve view_quotes vue.

1 votes

Après avoir réfléchi un moment, 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'était nécessaire. Si vous pouvez ajouter le compte, essayez-le d'abord.

689voto

Chococroc Points 3129

Cela se produit généralement lors de l'exportation de vues/triggers/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 DEFINISSEUR

Le plus simple est peut-être de le faire lors de l'importation initiale des objets de la base de données, en supprimant tous les objets de la base de données. DEFINER des déclarations de la décharge.

La modification ultérieure du définisseur est un peu plus délicate :

Comment changer le définisseur des vues

  1. Exécutez ce SQL pour générer les déclarations 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@%'

Faites attention, car cela modifiera tous les définisseurs de toutes les bases de données.

2. Créez 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 ce qui suit :

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 devez seulement changer someuser au nom de l'utilisateur manquant. Sur un serveur de développement local, il suffit généralement d'utiliser root .

Demandez-vous également s'il est nécessaire d'accorder à l'utilisateur un droit d'accès à l'information. ALL ou s'ils peuvent se contenter de moins.

1 votes

. et l'option d'octroi ne sont pas nécessaires.

0 votes

@Simon East : Vous avez fait un beau montage, merci beaucoup d'avoir amélioré autant la réponse.

0 votes

Je suggère d'ajouter, redémarrer l'instance mySQL après avoir exécuté le "UPDATE". mysql . proc p SET definer = 'user@%' WHERE definer='Root@%'" puisque les définisseurs des procédures ne sont actualisés qu'à ce moment-là.

149voto

Dave Z Dopson Points 499

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

4 votes

En outre, vous devrez accorder au moins le SELECT et EXECUTE à l'utilisateur ajouté. J'ai rencontré ce problème 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.

7 votes

Merci, c'était utile. Souvent, lors de la migration ou du déploiement à l'aide de mysqldump, l'utilisateur qui a créé la VIEW, le TRIGGER ou la 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, le déclencheur ou la vue ( DROP alors re- CREATE ) en utilisant un utilisateur valide sur le système cible devrait faire l'affaire.

41 votes

Vous pouvez également changer l'identité du définisseur en un utilisateur existant : UPDATE mysql.proc SET definer = 'my_new_user@localhost' WHERE db = 'mydatatbase';

39voto

BroknDodge Points 118

Si l'utilisateur existe, alors :

mysql> flush privileges;

37voto

kevin Points 1256

Créez l'utilisateur supprimé comme suit :

mysql> create user 'web2vi';

ou

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

3 votes

Après avoir créé cet utilisateur manqué, j'ai 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

7voto

cosmorogers Points 305

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 les serveurs auxquels il peut accéder, bien que j'aurais pensé que ce serait une erreur différente (EG vous pourriez avoir web2vi@localhost, mais vous accédez à la base de données en tant que web2vi@% (à n'importe quel endroit)).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X