Este artículo explica cómo solucionar problemas que pueden ocurrir cuando DEFINER El atributo se usa con objetos almacenados de MySQL (vistas, disparadores, funciones y procedimientos almacenados).
Problema
Puede experimentar problemas para ver o ejecutar objetos almacenados de MySQL (vistas, disparadores, funciones y procedimientos almacenados). Por ejemplo, puede recibir el siguiente mensaje de error en phpMyAdmin:
Error in processing request: No routine with name 'example' found in database 'example_db'. You might be lacking the necessary privileges to edit this routine.
Alternativamente, puede experimentar errores aparentemente aleatorios durante el funcionamiento del sitio web o una pérdida de la funcionalidad de la base de datos.
Causa
El DEFINITOR El atributo se utiliza para especificar una cuenta de usuario de MySQL que puede acceder a un objeto almacenado en particular. Sin embargo, pueden ocurrir problemas cuando la cuenta de usuario de MySQL en un DEFINER El atributo no coincide con el usuario de MySQL que ha iniciado sesión actualmente. Por ejemplo, esto puede ocurrir cuando se usa phpMyAdmin de cPanel, que siempre inicia sesión como el usuario de la cuenta principal (cPanel), y no como un usuario de la base de datos definida por el usuario.
De manera similar, este problema puede ocurrir después de la migración de un sitio si DEFINER los atributos de la base de datos no se actualizan con los usuarios de la base de datos del nuevo entorno de hospedaje.
Resolución
Para resolver este problema, puede intentar iniciar sesión en la base de datos como el usuario de la base de datos al que se hace referencia en DEFINER atributos (Para determinar el usuario correcto de la base de datos, es posible que deba volcar la base de datos y examinar el DEFINER atributos). Hay varias formas de iniciar sesión como diferentes usuarios de la base de datos:
Método #1:Usar una aplicación de cliente MySQL
Puede utilizar una aplicación de cliente MySQL, como MySQL Workbench, para iniciar sesión en la base de datos como el usuario de base de datos correcto. Luego podrá editar y ejecutar objetos almacenados utilizando la identidad correcta. Para obtener información sobre cómo usar una aplicación de cliente MySQL para conectarse a sus bases de datos, consulte este artículo.
Método #2:Usar el programa de línea de comandos 'mysql'
Alternativamente, puede usar mysql programa de línea de comandos para iniciar sesión en la base de datos como el usuario de base de datos correcto. Luego podrá editar y ejecutar objetos almacenados utilizando la identidad correcta. Para obtener información sobre cómo usar mysql programa de línea de comandos, consulte este artículo.
Método #3:Use una instalación personalizada de phpMyAdmin
Si no desea utilizar una aplicación de cliente MySQL o la línea de comandos, puede crear una instalación independiente de phpMyAdmin en su cuenta de alojamiento. Esta instalación personalizada le permite iniciar sesión en la base de datos como el usuario de la base de datos correcto en lugar de como el usuario de la cuenta principal (cPanel). Para obtener información sobre cómo crear una instalación personalizada de phpMyAdmin, consulte este artículo.
A veces, no puede iniciar sesión en una base de datos como el usuario de la base de datos al que se hace referencia en DEFINER atributos Por ejemplo, un sitio que se ha migrado desde otro proveedor de hospedaje puede tener diferentes convenciones de nomenclatura de MySQL y puede ser imposible crear un usuario de base de datos con el nombre correcto. En este caso, debe hacer lo siguiente:
- Vuelca toda la base de datos en un archivo. Para obtener información sobre cómo hacer esto, consulte este artículo.
- Use su editor de texto preferido para actualizar manualmente el DEFINER atributos para hacer referencia a un usuario de la base de datos que usted controla.
- Importe la base de datos modificada a su cuenta. Para obtener información sobre cómo hacer esto, consulte este artículo.
- Pruebe la nueva base de datos. Ahora debería poder editar y ejecutar objetos almacenados utilizando la identidad correcta.
Más Información
Para obtener más información sobre los definidores, visite https://dev.mysql.com/doc/refman/8.0/en/stored-objects-security.html.