web-dev-qa-db-fra.com

Erreur MySQL 1449: L'utilisateur spécifié comme défineur n'existe pas

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

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?

303
Tech MLG

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 à un autre, car l'utilisateur qui a créé cet objet n'existe plus.

Vous avez deux options:

1. Changer le DEFINER

Ceci est probablement plus facile à faire lors de la première importation de vos objets de base de données, en supprimant les instructions DEFINER du dump.

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

Comment changer le definer 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. Copier et exécuter les instructions ALTER

Comment changer le definer 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 de toutes les bases de données.

2. Créez l'utilisateur manquant

Si vous avez trouvé une 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;

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

Cela a fonctionné comme un charme - il vous suffit de changer someuser pour le nom de l'utilisateur manquant. Sur un serveur de développement local, vous pouvez généralement simplement utiliser root.

Indiquez également si vous devez réellement accorder à l'utilisateur ALL des autorisations ou s'il peut le faire avec moins.

454
Chococroc

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

136
Dave Z Dopson

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 fois que vous mettez MySQL à niveau. Il vérifie les incompatibilités de toutes les tables de toutes les bases de données avec la version actuelle du serveur MySQL. Si une table présente une incompatibilité possible, elle est cochée. Si des problèmes sont détectés, la table est réparée. mysql_upgrade met également à niveau les tables système afin que vous puissiez tirer parti des nouveaux privilèges ou fonctionnalités éventuellement ajoutés.

48
artamonovdev

Si l'utilisateur existe, alors:

mysql> flush privileges;
35
BroknDodge

Créez l'utilisateur supprimé comme ceci:

mysql> create user 'web2vi';

ou

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

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 'Déclencheurs'
  5. Cliquez sur 'Edit' pour éditer le déclencheur
  6. Remplacez definer de [utilisateur @ localhost] par root @ localhost

J'espère que ça aide

22
hussainfrotan

La solution consiste en une requête d'une seule ligne comme ci-dessous:

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

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

19
Muhammad Azeem

Pour les futurs utilisateurs: un message similaire tente de mettre à jour une table dans une base de données ne contenant aucune vue. Après quelques recherches, il s’est avéré que j’avais importé des déclencheurs sur cette table, c’est ce que l’utilisateur a défini. Laisser tomber les déclencheurs a résolu le problème.

13
Chris Poirier

Fixé en exécutant les commentaires suivants.

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

si vous obtenez some_other au lieu de web2vi, vous devez modifier le nom en conséquence.

11
Selvamani

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é qu'il s'agirait d'une erreur différente (par exemple, vous pourriez avoir web2vi @ localhost, mais vous accédez à la base de données en tant que web2vi @% (à rien).

7
cosmorogers

solution rapide pour contourner et vider le fichier:

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

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 à partir de 'localhost', vous pouvez essayer:

web2vi@localhost

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

6
c-toesca

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

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

exemple:

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

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

Mysql default définit la sécurité des procédures sur "DEFINER" (CREATOR OF) .. vous devez définir la sécurité sur "invocateur".

4

Mes 5 centimes.

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

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

et en fait, OUI, l'utilisateur était invalide, mais il n'était pas évident de savoir où aller dès le premier coup d'œil.

4
Nick

J'ai eu le 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 la modification de la vue l'a corrigé. 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 ceci avec la ligne de commande mysql (en supposant que * nix n'est pas familier avec Windows):

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

Remarque: la commande génère un supplément de SELECT 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

3
Ziul

Votre vue "view_quotes" peut avoir été copiée à partir d'une base de données différente 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 (le fait de supprimer normalement la partie DEFINER = 'web2vi' @ '%' et d'exécuter le script fera l'affaire).

3
user1016736

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

3
jbaylina

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, lancez cette commande 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 'définisseur'.

Dans mon cas, c’était un vieux déclencheur barbu, que certains développeurs ont oublié de supprimer.

2
kivagant

Le problème est clair - MySQL ne trouve pas l’utilisateur spécifié comme défineur.

J'ai rencontré ce problème après avoir synchronisé le modèle de base de données à partir du serveur de développement, en l'appliquant à localhost, en apportant des modifications au modèle, puis en le réappliquant à localhost. Apparemment, une vue (modifiée) était définie et je ne pouvais donc pas 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 de sauvegarder les données si vous essayez ceci sur des tables.

  1. Connectez-vous à la base de données en tant que root (ou tout ce qui est suffisamment puissant pour apporter des modifications).
  2. Supprimez la vue, la table 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 souhaiterez peut-être supprimer SQL SECURITY DEFINER une partie de la définition de l'élément avec laquelle vous avez rencontré des problèmes.

P.S. Ce n'est ni une solution appropriée, ni la meilleure solution. Je viens de poster comme une solution possible (et très simple).

2
Pijusn

Vous pouvez essayer ceci:

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

S'il s'agit d'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, la meilleure solution consiste à créer le définisseur:

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

De référence MySQL sur 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. 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
jordeu

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

1
user1174436

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éer l'utilisateur; comme le dit l'autre réponse. ou
  2. Recréez les vues créées par l'utilisateur 'web2vi' à l'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 base de données (DB2), mais a gardé l'utilisateur de BD1 (elles étaient différentes). 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.

J'espère que cette aide.

1
Julio Indriago

Cela m'est arrivé après avoir importé un dump sous Windows 10 avec MYSQL Workbench 6.3 Community, avec "root @% n'existe pas". Même si l'utilisateur existait. J'ai d'abord essayé de commenter le DEFINER, cependant, cela n'a pas fonctionné. J'ai alors fait une chaîne de remplacer sur "racine @%" avec "racine @ localhost" et réimporté le dump. Cela a fait le tour pour moi.

1
Dévan Coetzee

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

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

plus de!

1
zhi.yang

L'utilisateur de la base de données semble également être sensible à la casse. Ainsi, alors que j'avais la racine '@'% user, je n'avais pas d'utilisateur racine '@'%. J'ai changé l'utilisateur pour qu'il soit en majuscule via Workbench et le problème a été résolu!

0
Metalmania

je suis venu ici pour le même problème, je ne pouvais trouver nulle part dans mon code où un certain utilisateur effectuait l'action. apparemment, c'était à partir d'un déclencheur qui utilisait un utilisateur qui avait été supprimé depuis longtemps (la base de données a été restaurée à partir d'une version plus ancienne). Par conséquent, si vous êtes perplexe, jetez un coup d'œil à vos événements, déclencheurs et routines de la base de données. J'espère que cela aidera quelqu'un.

0
Dan Levin

// met à jour toutes les procédures ou des procédures particulières selon votre utilisateur existant 1) UPDATE mysql.proc p SET definer = 'root @%' WHERE 1 = 1 LIMIT 1000;

2) les privilèges de vidage; // ou redémarrer le serveur

0
FantomX1

dans mon cas, il y avait un déclencheur sur cette table que je ne pouvais pas mettre à jour les données avec la même erreur.

Erreur MySQL 1449: L'utilisateur spécifié comme défineur n'existe pas

la solution consistait à supprimer les déclencheurs sur cette table et à les recréer à nouveau, ce qui corrigeait le problème, puisque le déclencheur était effectué avec un autre utilisateur depuis un autre serveur et que le nom d'utilisateur était modifié sur le nouveau serveur après le changement de société d'hébergement. c'est mes 2 cents

0
Nassim

Essayez ceci C'est une solution simple

mysql -u root -p
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

plus à https://stackoverflow.com/a/42183702/5407056

0
Latief Anwar

De plus, pour changer de définition pour TRIGGERS (ALTER ne fonctionne pas), vous pouvez le faire comme ceci:

Générez une commande DROP et une commande CREATE pour chaque déclencheur:

SELECT CONCAT("DROP TRIGGER ", trigger_name, ";", " CREATE TRIGGER ", TRIGGER_NAME, " AFTER ", EVENT_MANIPULATION, " ON ", EVENT_OBJECT_SCHEMA, ".", EVENT_OBJECT_TABLE, " FOR EACH ROW ", ACTION_STATEMENT, ";") AS sqlCommand FROM information_schema.triggers WHERE EVENT_OBJECT_SCHEMA = "yourdatabase";

Exécutez-le dans un foreach. J'utilise cela dans mon application lorsque je prends la base de données de production sur ma machine de développement et que je l'utilise avec un foreach sur toutes les commandes et que je recrée les déclencheurs automatiquement. Cela me donne la possibilité de l’automatiser.

Exemple en PHP/Laravel:

    $this->info('DROP and CREATE TRIGGERS');
    $pdo = DB::connection()->getPdo();
    $sql = 'SELECT CONCAT("DROP TRIGGER ", trigger_name, ";", " CREATE TRIGGER ", TRIGGER_NAME, " AFTER ", EVENT_MANIPULATION, " ON ", EVENT_OBJECT_SCHEMA, ".", EVENT_OBJECT_TABLE, " FOR EACH ROW ", ACTION_STATEMENT, ";") AS sqlCommand FROM information_schema.triggers WHERE EVENT_OBJECT_SCHEMA = "mydatabase";';
    $stmt = $pdo->prepare($sql, [PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true]);
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $stmt->closeCursor();

    foreach($result as $rs){
        $pdo = DB::unprepared($rs['sqlCommand']);
        break;
    }

Astuce: je dois le faire avec pdo à cause du problème de requête de tampon mysql, décrit ici

0
ndberg