HOWTO · MySQL
Revocar privilegios en MySQL
En la publicación de hoy, aprenderemos cómo revocar privilegios en MySQL.
En esta página
Usa REVOKE para quitar privilegios concedidos previamente a una cuenta de MySQL. Una revocación especifica la cuenta y el alcance del privilegio; no elimina la cuenta. Los ejemplos usan 'john'@'localhost' y objetos ilustrativos. No se proporcionaron la versión del servidor MySQL ni pruebas de ejecución. Por tanto, considera las sentencias SQL como ejemplos de sintaxis y consulta la documentación de tu versión antes de aplicarlas.
Comprender el alcance de los privilegios de MySQL
Una cuenta se identifica tanto por el nombre de usuario como por el host, por ejemplo, 'john'@'localhost'. Una parte de host distinta puede identificar otra cuenta, así que confirma cuál es la cuenta exacta antes de cambiar sus accesos. REVOKE quita únicamente los privilegios indicados en el nivel especificado. Entre los niveles habituales están el global (*.*), el de base de datos (sales.*), el de tabla (sales.orders) y el de columna (una lista de columnas de una tabla). Una concesión de alcance más amplio puede seguir dando acceso aunque se retire otra más específica.
La sentencia GRANT correspondiente es un contexto útil para revisar cómo se asignó el acceso. GRANT OPTION es independiente: permite que una cuenta vuelva a conceder privilegios a otros. SHOW GRANTS sirve para inspeccionar las concesiones actuales de la cuenta después de un cambio.
Revocar privilegios específicos
Indica los privilegios, el nivel del objeto y la cuenta. Por ejemplo, esta ilustración de sintaxis quita el privilegio de tabla SELECT de la cuenta especificada:
REVOKE SELECT ON sales.orders FROM 'john'@'localhost';
Para quitar más de un privilegio en ese mismo nivel, sepáralos con comas:
REVOKE SELECT, INSERT ON sales.orders FROM 'john'@'localhost';
Usa el alcance que corresponda a la concesión que quieres cambiar. Por ejemplo, ON sales.* se refiere al nivel de base de datos, mientras que ON *.* se refiere al nivel global. Una concesión a nivel de columna requiere indicar la columna correspondiente en la especificación del privilegio; no la sustituyas por una sentencia a nivel de tabla suponiendo que tiene el mismo alcance.
Este fragmento de Python construye una sentencia legible para la cuenta del ejemplo. Solo crea una cadena: no se conecta a MySQL ni ejecuta la sentencia SQL. Las pruebas de ejecución suministradas indican que el fragmento de Python se ejecutó correctamente, pero la sentencia SQL no se probó en un servidor MySQL.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
account = "'john'@'localhost'"
table = "sales.orders"
statement = f"REVOKE SELECT ON {table} FROM {account};"
print(statement)
REVOKE SELECT ON sales.orders FROM 'john'@'localhost';
Revocar todos los privilegios y la opción de concesión
Para quitar todos los privilegios y la capacidad de conceder privilegios a una cuenta, usa la forma de revocación amplia:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'john'@'localhost';
La sentencia afecta a la cuenta indicada; no revoca el acceso de todas las cuentas de MySQL ni elimina la cuenta. Antes de usar una revocación amplia, confirma cuidadosamente cuál es la cuenta y luego inspecciona las concesiones que conserve. Si solo necesitas quitar la capacidad de transmitir privilegios a otros, trata GRANT OPTION como el privilegio específico que debes revocar; no supongas que al revocar privilegios de datos también lo eliminas.
En esta sintaxis, MySQL no usa PUBLIC como destino universal para todas las cuentas. Para cambiar el acceso de varias cuentas, realiza una operación con el alcance adecuado para cada cuenta concreta y verifica cada resultado. No deduzcas que una sentencia dirigida a una sola cuenta tiene efecto global.
Revocar roles y privilegios de roles
La asignación de roles y las concesiones directas de privilegios están relacionadas, pero son distintas. Un rol puede proporcionar privilegios a una cuenta, así que quitar un privilegio directo quizá no elimine el acceso que la cuenta recibe mediante un rol. Del mismo modo, revocar la asignación de un rol es una tarea distinta de revocar un privilegio.
La sintaxis y el comportamiento de los roles pueden depender de la versión instalada de MySQL y de su configuración. Como no se proporcionó una versión, esta guía no prescribe una sentencia para revocar roles. Consulta la documentación de la versión exacta del servidor, determina si el acceso proviene de una concesión directa o de un rol asignado y elige la operación correspondiente.
Verificar los cambios y solucionar problemas
Después de una revocación, inspecciona la cuenta de destino con SHOW GRANTS FOR 'john'@'localhost';. Revisa las sentencias de concesión que devuelve para la cuenta y el alcance pertinentes, y ten en cuenta las concesiones de roles que aparezcan. El resultado depende de la cuenta y de sus concesiones; no hay una salida de éxito universal que se pueda copiar. Estos ejemplos no se han ejecutado en un servidor MySQL.
Si la cuenta todavía tiene acceso, comprueba que la parte de host coincida con la cuenta usada para conectarse, busca concesiones de alcance más amplio, como privilegios de base de datos o globales, e inspecciona el acceso derivado de roles. Si se rechaza una sentencia, verifica el nivel del privilegio y la sintaxis en la documentación de la versión de tu servidor, y asegúrate de que quien la ejecuta tenga autoridad para revocar esa concesión. Volver a comprobar con SHOW GRANTS después de corregir la cuenta o el alcance ayuda a distinguir entre una concesión que no cambió y un acceso que proviene de otra fuente.