the specified not infoschema info hy000 exist error does definer code mysql permissions

mysql - infoschema - the user specified as a definer(''''@'' '') does not exist



Error de MySQL 1449: el usuario especificado como definidor no existe (30)

¿Por qué estoy recibiendo ese error? ¿Cómo lo arreglo?

Pasé una hora antes de encontrar una decisión para un problema como este. Pero, en mi caso, corrí esto:

mysql> UPDATE `users` SET `somefield` = 1 WHERE `user_id` = 2; ERROR 1449 (HY000): The user specified as a definer (''root''@''%'') does not exist

Si realmente quieres encontrar el problema, simplemente ejecuta estos comandos uno por uno:

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

... y, después de cada uno de ellos, busque el campo ''definidor''.

En mi caso, era un disparador antiguo con barba, que alguien de los desarrolladores olvidó eliminar.

Cuando ejecuto la siguiente consulta me sale un error:

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

El mensaje de error es:

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

¿Por qué estoy recibiendo ese error? ¿Cómo lo arreglo?


Crea el usuario eliminado así:

mysql> create user ''web2vi'';

o

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


Desde la referencia de MySQL de CREATE VIEW :

Las cláusulas DEFINER y SQL SECURITY especifican el contexto de seguridad que se utilizará al verificar los privilegios de acceso en el momento de la invocación de la vista.

Este usuario debe existir y siempre es mejor usar ''localhost'' como nombre de host. Así que creo que si comprueba que el usuario existe y lo cambia a ''localhost'' en la vista de creación, no tendrá este error.


El problema está claro: MySQL no puede encontrar el usuario especificado como el definidor.

Encontré este problema después de sincronizar el modelo de base de datos desde el servidor de desarrollo, aplicarlo a localhost, hacer cambios en el modelo y luego volver a aplicarlo a localhost. Aparentemente había una vista (modifiqué) definida y no pude actualizar mi versión local.

Cómo arreglar (fácilmente) :

Nota: implica la eliminación, por lo que funciona bien para las vistas, pero asegúrese de tener una copia de seguridad de los datos si intenta esto en las tablas.

  1. Inicie sesión en la base de datos como root (o lo que tenga el poder suficiente para realizar cambios).
  2. Eliminar vista, tabla o lo que sea que tenga problemas.
  3. Sincronice su nuevo modelo: no se quejará de algo que no existe ahora. Es posible que desee eliminar la parte DEFINER DE SEGURIDAD DE SQL de la definición del elemento con el que tuvo problemas.

PD: Esta no es una solución adecuada ni la mejor. Acabo de publicarlo como una solución posible (y muy simple).



El usuario de la base de datos también parece ser sensible a las mayúsculas y minúsculas, así que mientras tenía un usuario root ''@''%, no tenía un usuario ROOT ''@''%. Cambié el usuario para que esté en mayúsculas a través del entorno de trabajo y el problema se resolvió.


El usuario que creó originalmente la vista o el procedimiento de SQL se ha eliminado. Si vuelve a crear ese usuario, debería corregir su error.


En mi caso, la tabla tenía un disparador con un usuario DEFINER que no existía.


Esto me sucedió después de que importé un volcado en Windows 10 con MYSQL Workbench 6.3 Community, con "root @% no existe". A pesar de que el usuario existía. Primero intenté comentar el DEFINER, sin embargo, esto no funcionó. Luego hice una cadena de reemplazo en "root @%" con "root @ localhost" y reimporté el volcado. Esto hizo el truco para mí.


Esto ocurre comúnmente cuando se exportan vistas / activadores / procedimientos de una base de datos o servidor a otro ya que el usuario que creó ese objeto ya no existe.

Tienes dos opciones:

1. Cambia el DEFINER

Es posible que esto sea lo más fácil de hacer cuando se importan inicialmente los objetos de su base de datos, eliminando cualquier declaración DEFINER del volcado.

Cambiar el definidor más tarde es un poco más complicado:

Cómo cambiar el definidor para vistas

  1. Ejecute este SQL para generar las instrucciones ALTER necesarias

    SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ", table_name, " AS ", view_definition, ";") FROM information_schema.views WHERE table_schema=''your-database-name'';

  2. Copia y ejecuta las instrucciones ALTER

Cómo cambiar el definidor para procedimientos almacenados.

Ejemplo:

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

Tenga cuidado, porque esto cambiará todos los definidores para todas las bases de datos.

2. Crea el usuario que falta.

Si has encontrado el siguiente error al utilizar la base de datos MySQL:

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

Entonces puedes resolverlo usando lo siguiente:

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

Esto funcionó a la perfección: solo tienes que cambiar el nombre del usuario faltante por algún usuario. En un servidor de desarrollo local, es posible que solo use root .

También considere si realmente necesita otorgarle al usuario ALL permisos o si podrían hacerlo con menos.


La solución es solo una consulta de línea como se muestra a continuación:

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

Reemplace ROOT con su nombre de usuario mysql. Reemplace la PASSWORD con su contraseña de mysql.


Mis 5 centavos.

Tuve el mismo error mientras intentaba seleccionar desde una vista.

Sin embargo, el problema parece ser que esta vista, seleccionada desde otra vista que se restauró desde la copia de seguridad de un servidor diferente.

y de hecho, SÍ, el usuario no era válido, pero no era obvio a dónde ir desde el primer vistazo.


Para futuros usuarios de Google: Recibí un mensaje similar al intentar actualizar una tabla en una base de datos que no contenía vistas. Después de algunas excavaciones, resultó que había importado activadores en esa tabla, y esas eran las cosas definidas por el usuario inexistente. Soltar los disparadores solucionó el problema.


Puedes probar esto:

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


Se corrigió ejecutando los siguientes comentarios.

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

Si está obteniendo some_other otro en lugar de web2vi , debe cambiar el nombre en consecuencia.


Si el usuario existe, entonces:

mysql> flush privileges;


Si este es un procedimiento almacenado, puede hacer:

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

Pero esto no es aconsejable.

Para mí, mejor solución es crear el definidor:

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


Sigue estos pasos:

  1. Ir a PHPMyAdmin
  2. Seleccione su base de datos
  3. Selecciona tu mesa
  4. En el menú superior, haga clic en ''Desencadenadores''
  5. Haga clic en ''Editar'' para editar el disparador
  6. Cambie el definidor de [user @ localhost] a root @ localhost

Espero eso ayude


Su vista, "view_quotes" puede haberse copiado de una base de datos diferente donde "web2vi" es un usuario válido en una base de datos donde "web2vi" no es un usuario válido.
Agregue el usuario "web2vi" a la base de datos o modifique la vista (normalmente eliminando la parte DEFINER = ''web2vi'' @ ''%'' y ejecutando la secuencia de comandos hará el truco)


Tengo el mismo error después de actualizar mysql.

El error se ha corregido después de este comando:

mysql_upgrade -u root

mysql_upgrade debe ejecutarse cada vez que actualice MySQL. Comprueba todas las tablas en todas las bases de datos en busca de incompatibilidades con la versión actual de MySQL Server. Si se encuentra que una tabla tiene una posible incompatibilidad, se verifica. Si se encuentra algún problema, la tabla se repara. mysql_upgrade también actualiza las tablas del sistema para que pueda aprovechar los nuevos privilegios o capacidades que podrían haberse agregado.


Trate de establecer su procedimiento como SECURITY INVOKER

Mysql predeterminado establece la seguridad de los procedimientos como "DEFINER" (CREADOR DE) .. debe establecer la seguridad en el "invoker".


Tuve el mismo problema con el usuario root y funcionó cuando reemplacé

root@%

por

root@localhost

Por lo tanto, si el usuario ''web2vi'' puede conectarse desde ''localhost'', puede intentar:

web2vi@localhost

Estoy conectado remotamente a la base de datos.


Tuve el mismo problema hace unos minutos, me encontré con este problema después de eliminar un usuario no utilizado de la tabla mysql.user, pero al corregirlo la vista, aquí hay un comando práctico que lo hace muy simple:

SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ", table_name," AS ", view_definition,";") FROM information_schema.views WHERE table_schema=''databasename''

Mezcle esto con la línea de comando mysql (asumiendo que * nix, no está familiarizado con Windows):

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

Nota: el comando genera y SELECT CONCAT adicional en el archivo, lo que hace que mysql -uuser -ppass databasename < alterView.sql falle si no lo elimina.

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


Una o varias de sus vistas fueron creadas / registradas por otro usuario. Tendrás que consultar al propietario de la vista y:

  1. Recrear al usuario; como dicen las otras respuestas. o
  2. Vuelva a crear las vistas que fueron creadas por el usuario ''web2vi'' usando ALTER VIEW

Tuve este problema una vez.

Estaba intentando migrar vistas, desde BD1 a BD2, usando SQLYog. SQLYog recreó las vistas en la otra base de datos (DB2), pero mantuvo al usuario de BD1 (donde eran diferentes). Más tarde, me di cuenta de que las vistas que estaba usando en mi consulta tenían el mismo error que usted, incluso cuando no estaba creando ninguna vista.

Espero que esto ayude.


Vaya a la sección de rutina de edición y, al final, cambie el Tipo de seguridad de Definidor a Invoker.


Vine aquí por el mismo problema, no pude encontrar en ningún lugar de mi código dónde un determinado usuario estaba realizando la acción. al parecer, se trataba de un activador que estaba usando un usuario que se eliminó durante mucho tiempo (la base de datos se restauró de una versión anterior), por lo que, en caso de que quede desconcertado, revise sus eventos / activadores / rutinas de la base de datos. Espero que esto ayude a alguien.


cuando mysql.proc está vacío, pero el sistema siempre nota que "[email protected].%" para table_name no existe, simplemente hace root en la línea de comandos de mysql y escribe:

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

¡terminado!


en mi caso tuve un disparador en esa tabla por el que no pude actualizar los datos con el mismo error.

Error de MySQL 1449: el usuario especificado como definidor no existe

la solución fue eliminar los desencadenantes en esa tabla y volver a crearlos, esto solucionó el problema, ya que el desencadenante se realizó con otro usuario de otro servidor y el nombre de usuario cambió en el nuevo servidor después de cambiar la empresa de alojamiento. esos son mis 2 centavos


solución rápida para evitar y volcar el archivo:

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


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

ejemplo:

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