En el mundo de la gestión de bases de datos, la seguridad es un pilar fundamental. Controlar quién tiene acceso a qué datos y qué acciones puede realizar es crucial para proteger la información sensible y mantener la integridad del sistema. Para lograr esto, los sistemas de bases de datos relacionales, especialmente aquellos que utilizan SQL, emplean un modelo de permisos. Dentro de este modelo, existen comandos específicos para otorgar y gestionar estos permisos. Uno de los más importantes es el comando REVOKE.

¿Qué es el Comando REVOKE en SQL?
El comando REVOKE en SQL se utiliza para retirar o cancelar permisos que fueron previamente otorgados a un usuario o un rol sobre un objeto de la base de datos. Esencialmente, es la herramienta que te permite restringir la capacidad de un usuario o rol para realizar ciertas operaciones, como consultar datos, insertar nuevos registros, modificar información existente, eliminar datos, o incluso crear nuevos objetos dentro de la base de datos.
Imagina que has concedido permiso a un equipo para actualizar una tabla específica. Si la responsabilidad de ese equipo cambia, o si un miembro deja el equipo, puedes usar REVOKE para quitarles ese permiso de actualización, asegurando que solo las personas autorizadas puedan modificar la tabla.
Además de las operaciones básicas de manipulación de datos (SELECT, INSERT, UPDATE, DELETE) y de definición de objetos (CREATE), REVOKE también puede utilizarse para retirar permisos relacionados con la definición de restricciones (como llaves foráneas) o la modificación de registros específicos.
REVOKE vs GRANT: Los Opuestos de la Gestión de Permisos
El comando REVOKE es el opuesto directo del comando GRANT. Mientras que GRANT se utiliza para otorgar permisos a un usuario o rol, REVOKE se utiliza para quitarlos. Son las dos caras de la moneda en la administración de accesos dentro de una base de datos.
Permiten un control granular sobre las acciones que las diferentes entidades (usuarios, roles, aplicaciones) pueden realizar sobre los distintos objetos (tablas, vistas, procedimientos almacenados, etc.).
Aquí tienes una comparación simple entre ambos:
| Comando | Propósito | Efecto |
|---|---|---|
| GRANT | Otorgar permisos | Permite a un principal realizar una acción |
| REVOKE | Retirar permisos | Elimina un permiso previamente otorgado |
Existe otro comando relacionado, DENY, que también se utiliza para la gestión de permisos. Mientras que REVOKE elimina un permiso que fue concedido, DENY explícitamente prohíbe una acción, incluso si el usuario o rol obtiene el permiso a través de otra ruta (por ejemplo, a través de la membresía en múltiples roles). REVOKE simplemente elimina el permiso específico que se revocó, pero si el usuario todavía lo tiene por otra vía, lo conserva. DENY prevalece sobre GRANT.

Sintaxis General del Comando REVOKE
La sintaxis general del comando REVOKE varía ligeramente entre los diferentes sistemas de gestión de bases de datos (DBMS) como MySQL, PostgreSQL, SQL Server, Oracle, etc., pero la estructura básica es similar:
REVOKE [permiso(s)] ON [objeto] FROM [usuario(s) o rol(es)];
Esta sintaxis nos muestra los componentes clave:
- [permiso(s)]: Especifica los permisos que se desean retirar (por ejemplo, SELECT, INSERT, DELETE, UPDATE, EXECUTE, REFERENCES, ALL, etc.).
- [objeto]: Especifica el objeto de la base de datos sobre el cual se retiran los permisos (por ejemplo, una tabla, una vista, un procedimiento almacenado, etc.). A menudo se especifica con la forma
[tipo_objeto]::[nombre_objeto], aunque el tipo puede ser opcional en algunos casos o sintaxis. - [usuario(s) o rol(es)]: Especifica las entidades (principales de la base de datos) a las que se les retiran los permisos. Pueden ser usuarios individuales, roles de base de datos, o incluso roles de aplicación.
Sintaxis Específica en Transact-SQL (SQL Server)
La sintaxis en SQL Server es más detallada y ofrece opciones adicionales:
REVOKE [ GRANT OPTION FOR ] <permission> [ ,...n ] ON [ OBJECT :: ][ schema_name ]. object_name [ ( column [ ,...n ] ) ] { FROM | TO } <database_principal> [ ,...n ] [ CASCADE ] [ AS <database_principal> ]
Analicemos los argumentos más importantes:
- <permission> [ ,...n ]: Lista de permisos específicos a revocar. Se pueden revocar múltiples permisos separándolos por comas.
- ALL [ PRIVILEGES ]: Una opción para revocar un conjunto de permisos comunes aplicables al objeto. El significado exacto de ALL varía según el tipo de objeto. Por ejemplo, para una tabla, ALL incluye DELETE, INSERT, REFERENCES, SELECT, UPDATE. PRIVILEGES es opcional y se incluye por compatibilidad con ANSI-92.
- ON [ OBJECT :: ][ schema_name ]. object_name: Especifica el objeto. OBJECT:: es opcional si se incluye el nombre del esquema.
schema_name.object_nameidentifica el objeto dentro de un esquema. - ( column [ ,...n ] ): Permite revocar permisos sobre columnas específicas dentro de una tabla, vista o función con valores de tabla. Solo SELECT, REFERENCES y UPDATE pueden revocarse a nivel de columna.
- { FROM | TO } <database_principal> [ ,...n ]: Especifica a quién se le retiran los permisos.
database_principalpuede ser un usuario, rol, rol de aplicación, etc. Se pueden especificar múltiples principales. Tanto FROM como TO son sinónimos en REVOKE. - GRANT OPTION FOR: Esta cláusula se utiliza para revocar el derecho de un principal de otorgar ese permiso a otros. Es importante notar que si el principal tiene el permiso sin la opción GRANT, el permiso *también* será revocado.
- CASCADE: Esta cláusula es crucial. Indica que si el principal al que le estás revocando un permiso había concedido ese mismo permiso a otras entidades (usando GRANT WITH GRANT OPTION), esa concesión también será revocada automáticamente. Una revocación en cascada de un permiso concedido con WITH GRANT OPTION revoca tanto GRANT como DENY de dicho permiso en los principales inferiores en la cadena.
- AS <database_principal>: Especifica que la revocación se realiza como si la estuviera ejecutando la entidad principal especificada. Requiere permisos adecuados.
Ejemplos Prácticos de REVOKE
Veamos algunos ejemplos comunes del uso del comando REVOKE, basados en la sintaxis de Transact-SQL:
A. Revocar el permiso SELECT en una tabla
Supongamos que queremos impedir que el usuario 'UsuarioPrueba' pueda leer datos de la tabla 'Clientes'.
USE MiBaseDeDatos; REVOKE SELECT ON OBJECT::dbo.Clientes FROM UsuarioPrueba; GOEste comando retira específicamente el permiso de consulta (SELECT) sobre la tabla 'Clientes' ubicada en el esquema 'dbo' para el usuario 'UsuarioPrueba'.
B. Revocar el permiso EXECUTE en un procedimiento almacenado
Si tenemos un rol de aplicación llamado 'PersonalLectura' al que le habíamos dado permiso para ejecutar un procedimiento almacenado 'ObtenerReporteVentas', y ahora ya no queremos que lo haga:
USE MiBaseDeDatos; REVOKE EXECUTE ON OBJECT::dbo.ObtenerReporteVentas FROM PersonalLectura; GOEsto elimina la capacidad del rol 'PersonalLectura' para ejecutar el procedimiento almacenado especificado.
C. Revocar un permiso a nivel de columna con CASCADE
Consideremos que el usuario 'Auditor' tenía permiso para ver la columna 'Salario' en la tabla 'Empleados', y además tenía la capacidad de conceder ese permiso a otros. Si queremos retirar este permiso y asegurarnos de que nadie más lo conserve si 'Auditor' se lo concedió:
USE MiBaseDeDatos; REVOKE REFERENCES (Salario) ON OBJECT::dbo.Empleados FROM Auditor CASCADE; GOAquí, revocamos el permiso REFERENCES (que permite crear restricciones de llave foránea que referencien la columna, y a menudo se asocia con la capacidad de ver el dato) sobre la columna 'Salario' de la tabla 'Empleados' para el usuario 'Auditor'. La cláusula CASCADE asegura que si 'Auditor' había concedido este permiso a otros, esas concesiones también se anulan.
D. Revocar la opción de conceder un permiso
Si el usuario 'AdminTemporal' tenía permiso para insertar datos en la tabla 'Productos' Y además tenía la opción de conceder ese permiso a otros (WITH GRANT OPTION), pero queremos quitarle solo la capacidad de conceder, manteniendo su permiso de insertar:
USE MiBaseDeDatos; REVOKE GRANT OPTION FOR INSERT ON OBJECT::dbo.Productos FROM AdminTemporal; GONota importante: Como se mencionó en la descripción de GRANT OPTION FOR, si 'AdminTemporal' solo tenía el permiso INSERT *con* la opción GRANT, este comando también le revocará el permiso INSERT en sí mismo. Si tenía el permiso INSERT otorgado por otra vía *sin* la opción GRANT, entonces solo se revoca la opción de conceder.
Permisos Comunes y Objetos Protegibles
Los permisos que puedes revocar varían según el tipo de objeto de la base de datos. Algunos permisos son universales para ciertos tipos de objetos, mientras que otros son más específicos. La documentación del DBMS específico que estés utilizando siempre es la fuente más precisa, pero aquí hay una tabla general de permisos comunes a nivel de objeto de esquema en SQL Server y los permisos más amplios que los incluyen por implicación:
| Permiso de Objeto | Implícito en (Permiso de Objeto) | Implícito en (Permiso de Esquema) |
|---|---|---|
| ALTER | CONTROL | ALTER, CONTROL |
| CONTROL | CONTROL | CONTROL |
| DELETE | CONTROL | CONTROL |
| EXECUTE | CONTROL | CONTROL |
| INSERT | CONTROL | CONTROL |
| RECEIVE | CONTROL | CONTROL |
| REFERENCES | CONTROL | CONTROL |
| SELECT | CONTROL, RECEIVE | CONTROL |
| TAKE OWNERSHIP | CONTROL | CONTROL |
| UPDATE | CONTROL | CONTROL |
| VIEW CHANGE TRACKING | CONTROL | CONTROL |
| VIEW DEFINITION | CONTROL | CONTROL |
Esta tabla muestra la jerarquía de permisos. Por ejemplo, si un principal tiene el permiso CONTROL sobre una tabla, implícitamente tiene todos los permisos listados para ese objeto (ALTER, DELETE, INSERT, etc.). Revocar un permiso de nivel superior (como CONTROL) retirará implícitamente todos los permisos de nivel inferior que estaban contenidos en él.
¿Cómo Verificar Permisos Después de Revocar?
Después de realizar operaciones de GRANT, REVOKE o DENY, es fundamental verificar que los permisos se hayan aplicado correctamente. Los sistemas de bases de datos proporcionan vistas de catálogo y funciones integradas para consultar esta información. En SQL Server, por ejemplo, puedes usar:
- Vistas de catálogo de objetos: Como
sys.objectsy otras vistas relacionadas para obtener información sobre los objetos. sys.fn_builtin_permissions (Transact-SQL): Muestra una lista jerárquica de los permisos integrados en el servidor.HAS_PERMS_BY_NAME (Transact-SQL): Permite verificar si el principal actual tiene un permiso específico en un elemento protegible dado por su nombre.sys.fn_my_permissions (Transact-SQL): Devuelve una lista de los permisos efectivos concedidos al principal en un elemento protegible especificado.
Utilizar estas herramientas te ayuda a auditar y confirmar el estado de los permisos en tu base de datos.

Preguntas Frecuentes sobre REVOKE
¿Qué comando se emplea para quitar permisos en SQL?
El comando principal empleado para quitar permisos en SQL es REVOKE.
¿Qué diferencia hay entre los comandos Grant y Revoke?
La diferencia fundamental es su función: GRANT otorga permisos a un principal sobre un objeto, mientras que REVOKE retira permisos previamente otorgados.
¿Qué sucede si revoco un permiso que un usuario obtuvo a través de un rol?
Si revocas un permiso directamente a un usuario, solo se retira el permiso que se le otorgó directamente. Si ese usuario también tiene el mismo permiso porque es miembro de un rol al que se le concedió ese permiso, el usuario conservará el permiso a través de la membresía del rol. Para retirar el permiso completamente, tendrías que revocarlo también al rol, o bien usar el comando DENY sobre el usuario para prohibirle explícitamente la acción, independientemente de los permisos concedidos.
¿Cuándo debo usar REVOKE CASCADE?
Debes usar REVOKE CASCADE cuando quieras asegurarte de que si el principal al que le estás quitando un permiso, a su vez, había concedido ese mismo permiso a otros principales, esas concesiones secundarias también sean eliminadas automáticamente. Esto es útil para limpiar cadenas de permisos.
¿Qué permisos puedo revocar?
Puedes revocar la mayoría de los permisos que se pueden conceder, como SELECT, INSERT, UPDATE, DELETE, EXECUTE, REFERENCES, ALTER, CONTROL, etc. Los permisos aplicables dependen del tipo de objeto sobre el que estás actuando (tabla, vista, procedimiento, función, etc.).
Conclusión
El comando REVOKE es una herramienta esencial en la administración de la seguridad de las bases de datos. Permite a los administradores retirar permisos específicos de usuarios y roles sobre objetos de la base de datos, asegurando que el acceso a la información y la capacidad de realizar acciones estén alineados con las responsabilidades y necesidades de cada entidad. Entender su sintaxis, sus opciones (como CASCADE y GRANT OPTION FOR), y su relación con los comandos GRANT y DENY es fundamental para mantener un modelo de seguridad robusto y controlado en cualquier entorno de base de datos.
Si quieres conocer otros artículos parecidos a REVOKE en Bases de Datos: Retirando Permisos puedes visitar la categoría Bases de datos.

Aprende mas sobre MySQL