REVOKE — elimina privilegios de acceso
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ...] }
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
ON [ TABLE ] table_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE sequence_name [, ...]
| ALL SEQUENCES IN SCHEMA schema_name [, ...] }
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON DOMAIN domain_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER fdw_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER server_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ EXECUTE | ALL [ PRIVILEGES ] }
ON { { FUNCTION | PROCEDURE | ROUTINE } function_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
| ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] }
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE lang_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT loid [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { SET | ALTER SYSTEM } [, ...] | ALL [ PRIVILEGES ] }
ON PARAMETER configuration_parameter [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE tablespace_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON TYPE type_name [, ...]
FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
REVOKE [ { ADMIN | INHERIT | SET } OPTION FOR ]
role_name [, ...] FROM role_specification [, ...]
[ GRANTED BY role_specification ]
[ CASCADE | RESTRICT ]
donde role_specification puede ser:
[ GROUP ] role_name
| PUBLIC
| CURRENT_ROLE
| CURRENT_USER
| SESSION_USER
El comando REVOKE revoca privilegios previamente otorgados
a uno o más roles. La palabra clave PUBLIC se refiere al grupo
definido implícitamente de todos los roles.
Consulta la descripción del comando GRANT
para conocer el significado de los tipos de privilegios.
Ten en cuenta que cualquier rol particular tendrá la suma de los privilegios otorgados
directamente a él, los privilegios otorgados a cualquier rol del que sea miembro actualmente
y los privilegios otorgados a PUBLIC. Así, por ejemplo, revocar el
privilegio SELECT de PUBLIC no significa necesariamente
que todos los roles hayan perdido el privilegio SELECT sobre el objeto:
aquellos a quienes se les otorgó directamente o a través de otro rol aún lo tendrán. De manera
similar, revocar SELECT a un usuario podría no impedir que ese usuario use
SELECT si PUBLIC u otro rol de membresía aún tiene
derechos de SELECT.
Si se especifica GRANT OPTION FOR, solo se revoca la opción de otorgar (grant option)
para el privilegio, no el privilegio en sí. De lo contrario, se revocan tanto el privilegio como la opción de otorgar.
Si un usuario posee un privilegio con la opción de otorgar y lo ha otorgado a otros usuarios,
entonces los privilegios que poseen esos otros usuarios se denominan privilegios dependientes.
Si se está revocando el privilegio o la opción de otorgar que posee el primer usuario y existen
privilegios dependientes, esos privilegios dependientes también se revocan si se especifica
CASCADE; si no se especifica, la acción de revocación fallará. Esta revocación
recursiva solo afecta a los privilegios que se otorgaron a través de una cadena de usuarios
que se pueda rastrear hasta el usuario que es el sujeto de este comando REVOKE.
Por lo tanto, los usuarios afectados podrían mantener efectivamente el privilegio si también
les fue otorgado a través de otros usuarios.
Al revocar privilegios sobre una tabla, los privilegios de columna correspondientes (si los hay) también se revocan automáticamente en cada columna de la tabla. Por otro lado, si a un rol se le han otorgado privilegios sobre una tabla, revocar los mismos privilegios de columnas individuales no tendrá ningún efecto.
Al revocar la membresía en un rol, GRANT OPTION se llama en su lugar
ADMIN OPTION, pero el comportamiento es similar. Ten en cuenta que, en versiones
anteriores a PostgreSQL 16, no se realizaba el seguimiento de los privilegios
dependientes para los otorgamientos de membresía de rol, por lo que CASCADE no tenía
efecto para la membresía de rol. Este ya no es el caso. Ten en cuenta también que esta forma del
comando no permite la palabra de adorno GROUP en
role_specification.
Al igual que ADMIN OPTION se puede eliminar de una concesión de rol existente, también
es posible revocar INHERIT OPTION o SET OPTION. Esto es equivalente
a establecer el valor de la opción correspondiente a FALSE.
Un usuario solo puede revocar los privilegios que fueron otorgados directamente por ese usuario.
Si, por ejemplo, el usuario A ha otorgado un privilegio con la opción de otorgar al usuario B,
y el usuario B a su vez se lo ha otorgado al usuario C, entonces el usuario A no puede revocar
el privilegio directamente a C. En su lugar, el usuario A podría revocar la opción de otorgar
al usuario B y usar la opción CASCADE para que el privilegio sea a su vez revocado
al usuario C. Para otro ejemplo, si tanto A como B han otorgado el mismo privilegio a C, A puede
revocar su propio otorgamiento pero no el de B, por lo que C seguirá teniendo efectivamente el privilegio.
Cuando alguien que no es propietario de un objeto intenta ejecutar REVOKE sobre
los privilegios del objeto, el comando fallará por completo si el usuario no tiene ningún privilegio
sobre el objeto. Mientras haya algún privilegio disponible, el comando procederá, pero revocará solo
aquellos privilegios para los cuales el usuario tiene opciones de otorgar. Las formas de REVOKE ALL
PRIVILEGES emitirán un mensaje de advertencia si no se poseen opciones de otorgar, mientras
que las otras formas emitirán una advertencia si no se poseen opciones de otorgar para cualquiera de los
privilegios nombrados específicamente en el comando. (En principio, estas declaraciones también se aplican
al propietario del objeto, pero dado que el propietario siempre se considera que posee todas las opciones
de otorgar, estos casos nunca pueden ocurrir).
Si un superusuario decide emitir un comando GRANT o REVOKE,
el comando se realiza como si fuera emitido por el propietario del objeto afectado. (Dado que los roles
no tienen propietarios, en el caso de un GRANT de membresía de rol, el comando se
realiza como si fuera emitido por el superusuario inicial o bootstrap). Dado que todos los privilegios
provienen en última instancia del propietario del objeto (posiblemente de forma indirecta a través de cadenas
de opciones de otorgar), es posible que un superusuario revoque todos los privilegios, pero esto podría
requerir el uso de CASCADE como se indicó anteriormente.
REVOKE también puede ser realizado por un rol que no sea el propietario del objeto afectado,
pero que sea miembro del rol propietario del objeto, o miembro de un rol que posea privilegios
WITH GRANT OPTION sobre el objeto. En este caso, el comando se ejecuta como si fuera
emitido por el rol contenedor que realmente es dueño del objeto o que posee los privilegios
WITH GRANT OPTION. Por ejemplo, si la tabla t1 es propiedad del rol
g1, del cual el rol u1 es miembro, entonces u1 puede
revocar privilegios sobre t1 que estén registrados como otorgados por g1.
Esto incluiría los otorgamientos hechos por u1 así como por otros miembros del rol
g1.
Si el rol que ejecuta REVOKE posee privilegios indirectamente a través de más de una ruta
de membresía de rol, no se especifica qué rol contenedor se utilizará para ejecutar el comando. En tales casos,
la mejor práctica es usar SET ROLE para convertirse en el rol específico con el que deseas
hacer el REVOKE. No hacerlo podría llevar a revocar privilegios distintos a los que tenías
previsto, o a no revocar nada en absoluto.
Consulta Section 5.8 para obtener más información sobre los tipos de privilegios específicos, así como sobre cómo inspeccionar los privilegios de los objetos.
Revoca el privilegio de inserción para el público en la tabla films:
REVOKE INSERT ON films FROM PUBLIC;
Revoca todos los privilegios del usuario manuel en la vista kinds:
REVOKE ALL PRIVILEGES ON kinds FROM manuel;
Ten en cuenta que esto realmente significa “revocar todos los privilegios que yo otorgué”.
Revoca la membresía en el rol admins del usuario joe:
REVOKE admins FROM joe;
Las notas de compatibilidad del comando GRANT se aplican
de manera análoga a REVOKE. Las palabras clave RESTRICT o CASCADE
son requeridas según el estándar, pero PostgreSQL asume RESTRICT
por defecto.