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?
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
-
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';
-
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.
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.
créer l'utilisateur supprimé comme suit:
mysql> create user 'web2vi';
ou
mysql> create user 'web2vi'@'%';
suivez ces étapes:
- Aller à PHPMyAdmin
- Sélectionnez Votre Base De Données
- Sélectionnez votre table
- dans le menu du haut cliquez sur "Triggers "
- cliquez sur "Modifier" pour modifier la commande
- changer la définition de [user@localhost] en root@localhost
j'Espère que ça aide
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.
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.
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.
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.
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)
solution rapide pour contourner et vider le fichier:
mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql
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.
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.
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".
dans mon cas, la table avait un déclencheur avec un utilisateur DEFINER qui n'existait pas.
grant all on *.* to 'username'@'%' identified by 'password' with grant option;
exemple:
grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;
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)
Vous pouvez essayer ceci:
$ mysql -u root -p
> grant all privileges on *.* to `root`@`%` identified by 'password';
> flush privileges;
à 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.
allez dans la section Modifier la routine et en bas, changez le Type de sécurité de Definer à Invoker.
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.
- Se connecter à la base de données en tant que root (ou ce qui a assez de pouvoir pour faire des changements).
- Supprimer vue, table ou ce que vous avez des problèmes avec.
- 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).
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
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:
- recréer l'utilisateur; comme le disent les autres réponses. ou
- 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.
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';
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!
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.
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.
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!
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
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.