En la administración de bases de datos MySQL/MariaDB, es fundamental poder consultar los permisos asignados a los usuarios. Compartimos varias consultas SQL muy útiles para obtener permisos establecidos y para generar comandos de asignación y de revocación de permisos en MySQL/MariaDB.

Consideraciones de Seguridad

  • Es conveniente tener copias de seguridad actualizadas de la base de datos antes de realizar cualquier cambio.
  • Estas consultas requieren privilegios de superusuario o acceso a las tablas del sistema de MySQL.
  • Las consultas SQL no ejecutan comandos de cambios de permisos, solo generan los comandos apropiados. Si decides usarlas, verifica los comandos generados antes de ejecutarlos en producción.
  • Si has ejecutado comandos de modificación de permisos, recuerda ejecutar FLUSH PRIVILEGES; después de modificar permisos manualmente.
  • Los cambios en mysql.tables_priv se reflejan inmediatamente, pero es buena práctica usar FLUSH PRIVILEGES.

Consulta SQL para mostrar todos los usuarios MySQL/MariaDB con su host asignado

La siguiente consulta SQL muestra todos los usuarios de un servidor de MySQL/MariaDB y su host () asignado:

Funciona tanto en versiones antiguas de MySQL/MariaBD como en versiones modernas.

Consulta SQL para ver todos los permisos de un usuario

Las siguientes consultas SQL muestran todos los permisos que tiene asignados un usuario específico desde cualquier host, incluyendo tanto privilegios a nivel de base de datos como a nivel de tabla.

Consulta para ver todos los permisos de un usuario desde cualquier host

Consulta SQL para obtener todos los permisos asignados a un usuario particular de MySQL/MariaDB. Esta consulta funcionará en versiones de MySQL inferiores a la 8.0 y MariaDB inferiores a la 10.x:

Propósito: esta consulta está diseñada para mostrar todos los permisos específicos de tablas a las que se ha asignado algún permiso (select, insert, update, delete, drop, alter) a un usuario particular en MySQL. Es especialmente útil para auditorías de seguridad o para replicar configuraciones de usuarios.

Tablas consultadas:

  • mysql.tables_priv: tabla del sistema de MySQL que almacena los privilegios a nivel de tabla.

Campos devueltos:

  • User: nombre del usuario MySQL.
  • Host: dirección o patrón de host desde el cual el usuario puede conectarse.
  • Db: nombre de la base de datos.
  • Table_name: nombre de la tabla específica.
  • Table_priv: privilegios a nivel de tabla (ej: Select, Insert, Update, Delete).
  • Column_priv: privilegios a nivel de columna (si los hay).

Ejemplo de resultado:

UserHostDbTable_nameTable_privColumn_priv
usproyectoa192.168.1.%bdproyectoafacturasSelectNULL

Cuándo usarla:

  • Para auditar permisos de usuarios.
  • Antes de eliminar o modificar usuarios.
  • Para documentar configuraciones de seguridad.
  • Para replicar permisos en otro servidor.

Para versiones modernas de MySQL y MariaDB, se puede usar esta consulta SQL:

Consulta para ver todos los permisos de un usuario a nivel de base de datos

La siguiente consulta SQL muestra todos los permisos que un usuario (si se indica el WHERE User = 'nombre_usuario') tiene a nivel de base de datos:

Propósito: esta consulta está diseñada para mostrar los privilegios que tiene un usuario específico a nivel de base de datos completa en MySQL/MariaDB. A diferencia de los permisos a nivel de tabla (que se ven en mysql.tables_priv), estos permisos aplican a todas las tablas dentro de una base de datos específica.

Tabla consultada:

  • mysql.db: tabla del sistema de MySQL que almacena los privilegios a nivel de base de datos.

Consulta universal para cualquier versión de MySQL/MariaDB para mostrar permisos asignados a usuarios

La siguiente consulta SQL obtiene todos los privilegios/permisos asignados a un usuario, tanto a tablas como a base de datos y es válida para cualquier versión de MySQL/MariaDB:

Consulta SQL para generar comandos GRANT para replicar permisos

Esta consulta transforma los permisos actuales en comandos SQL ejecutables que se pueden usar para recrear los mismos permisos en otro servidor o usuario.

La siguiente consulta SQL devuelve todos los comandos GRANT necesarios para replicar los permisos actuales asignados a un usuario particular MySQL/MariaDB:

Propósito: genera automáticamente los comandos GRANT necesarios para replicar exactamente los mismos permisos que tiene un usuario. Esto es de gran ayuda para migraciones, backups de configuraciones o para crear usuarios con permisos idénticos.

Funciones MySQL utilizadas:

  • CONCAT(): une múltiples cadenas de texto.
  • UPPER(): convierte texto a mayúsculas.
  • REPLACE(): reemplaza comas por comas con espacio para mejor formato.

Estructura del comando generado:

Características importantes:

  • Los nombres de base de datos y tabla se encierran en backticks (`) para manejar caracteres especiales.
  • Convierte automáticamente a mayúsculas los tipos de permisos.
  • Maneja múltiples permisos separados por comas (ej: «Select,Insert,Update»).
  • Filtra registros donde no hay permisos de tabla definidos.

Consulta SQL para generar comandos REVOKE para eliminar permisos

El complemento perfecto a la consulta anterior, genera los comandos para revocar permisos específicos.

Propósito: crea comandos REVOKE que permiten eliminar permisos específicos de manera controlada y precisa.

Ejemplo de resultado:

Comando propio de MySQL/MariaDB para mostrar todos los GRANTS de un usuario

MySQL/MariaDB también cuenta con un comando propio para obtener todos los GRANT (permisos) asignados a un usuario. Para listar todos los GRANT asignados al usuario actual (con el que estamos conectados a MySQL), usaremos el comando:

Para mostrar los GRANT de un usuario concreto: