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?
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:
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é:
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';
Copier et exécuter les instructions ALTER
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.
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.
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.
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.
Si l'utilisateur existe, alors:
mysql> flush privileges;
Créez l'utilisateur supprimé comme ceci:
mysql> create user 'web2vi';
ou
mysql> create user 'web2vi'@'%';
Suivez ces étapes:
J'espère que ça aide
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.
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.
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.
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).
solution rapide pour contourner et vider le fichier:
mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql
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.
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.
grant all on *.* to 'username'@'%' identified by 'password' with grant option;
exemple:
grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;
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".
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.
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
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).
Dans mon cas, la table avait un déclencheur avec un utilisateur DEFINER qui n'existait pas.
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.
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.
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).
Vous pouvez essayer ceci:
$ mysql -u root -p
> grant all privileges on *.* to `root`@`%` identified by 'password';
> flush privileges;
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';
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.
Allez dans la section de routine d'édition et en bas, changez le type de sécurité de Definer en Invoker.
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:
'web2vi'
à l'aide de ALTER VIEWJ'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.
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.
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!
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!
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.
// 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
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
Essayez ceci C'est une solution simple
mysql -u root -p
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
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