REVOKE — remove privilégios de acesso
REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ]nome_da_tabela
[, ...] | ALL TABLES IN SCHEMAnome_do_esquema
[, ...] } FROMgrupamento
[, ...] [ GRANTED BYgrupamento
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | REFERENCES } (nome_da_coluna
[, ...] ) [, ...] | ALL [ PRIVILEGES ] (nome_da_coluna
[, ...] ) } ON [ TABLE ]nome_da_tabela
[, ...] FROMgrupamento
[, ...] [ GRANTED BYgrupamento
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCEnome_da_sequência
[, ...] | ALL SEQUENCES IN SCHEMAnome_do_esquema
[, ...] } FROMgrupamento
[, ...] [ GRANTED BYgrupamento
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASEnome_do_banco_de_dados
[, ...] FROMgrupamento
[, ...] [ GRANTED BYgrupamento
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON DOMAINnome_do_domínio
[, ...] FROMgrupamento
[, ...] [ GRANTED BYgrupamento
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPERnome_do_empacotador_de_dados_estrangeiros
[, ...] FROMgrupamento
[, ...] [ GRANTED BYgrupamento
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVERnome_do_servidor
[, ...] FROMgrupamento
[, ...] [ GRANTED BYgrupamento
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON { { FUNCTION | PROCEDURE | ROUTINE }nome_da_função
[ ( [ [modo_do_argumento
] [nome_do_argumento
]tipo_de_dados_do_argumento
[, ...] ] ) ] [, ...] | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMAnome_do_esquema
[, ...] } FROMgrupamento
[, ...] [ GRANTED BYgrupamento
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGEnome_da_linguagem
[, ...] FROMgrupamento
[, ...] [ GRANTED BYgrupamento
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECToid_de_objeto_grande
[, ...] FROMgrupamento
[, ...] [ GRANTED BYgrupamento
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAnome_do_esquema
[, ...] FROMgrupamento
[, ...] [ GRANTED BYgrupamento
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACEnome_do_espaço_de_tabelas
[, ...] FROMgrupamento
[, ...] [ GRANTED BYgrupamento
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON TYPEnome_do_tipo_de_dados
[, ...] FROMgrupamento
[, ...] [ GRANTED BYgrupamento
] [ CASCADE | RESTRICT ] REVOKE [ ADMIN OPTION FOR ]nome_da_role
[, ...] FROMgrupamento
[, ...] [ GRANTED BYgrupamento
] [ CASCADE | RESTRICT ] ondegrupamento
pode ser: [ GROUP ]nome_da_role
| PUBLIC | CURRENT_ROLE | CURRENT_USER | SESSION_USER
O comando REVOKE
revoga privilégios concedidos
anteriormente a uma ou mais funções de banco de dados
(roles)
[221]
[222].
A palavra-chave PUBLIC
refere-se ao grupo
implicitamente definido de todas as funções de banco de dados.
Veja a descrição do comando GRANT, para conhecer o significado dos tipos de privilégio.
Note que uma determinada função de banco de dados terá a soma dos
privilégios concedidos diretamente a ela, com os privilégios
concedidos a qualquer função de banco de dados da qual seja atualmente
um membro, e com os privilégios concedidos a PUBLIC
.
Assim, por exemplo, revogar o privilégio SELECT
de
PUBLIC
não significa, necessariamente, que todas
as funções de banco de dados não têm mais o privilégio
SELECT
no objeto: aquelas que receberam o
privilégio diretamente, ou por meio de outra função de banco de dados,
ainda o possuem.
Da mesma forma, revogar o privilégio SELECT
de um usuário não irá impedir que esse usuário use o comando
SELECT
, se PUBLIC
, ou outra
função de banco de dados da qual é membro, ainda possuir o privilégio
SELECT
no objeto.
Se for especificado GRANT OPTION FOR
, será somente
revogada a opção de concessão do privilégio, não o próprio privilégio.
Caso contrário, tanto o privilégio quanto a opção de concessão seriam
revogados.
Se um usuário possui um privilégio com opção de concessão,
e o concedeu a outros usuários, os privilégios mantidos por esses
outros usuários são chamados de privilégios dependentes.
Se o privilégio, ou a opção de concessão, do primeiro usuário estiver
sendo revogado, e existirem privilégios dependentes, esses privilégios
dependentes também serão revogados se for especificado
CASCADE
; se não for especificado, a ação de
revogar irá falhar.
Essa revogação recursiva afeta apenas os privilégios que foram
concedidos por meio de uma cadeia de usuários, rastreável ao usuário
que é o objeto desse comando REVOKE
.
Assim, os usuários afetados ainda podem manter o privilégio, se este
também foi concedido por meio de outros usuários.
Ao revogar privilégios em uma tabela, os privilégios de coluna correspondentes (se houver) também são revogados automaticamente em cada coluna da tabela. Por outro lado, se uma função de banco de dados tiver privilégios concedidos em uma tabela, revogar os mesmos privilégios de colunas individuais não terá efeito.
Ao revogar ser membro de uma função de banco de dados,
a cláusula GRANT OPTION
passa a se chamar
ADMIN OPTION
, mas o comportamento é semelhante.
Essa forma do comando também permite a opção
GRANTED BY
, mas no momento essa opção é ignorada
(exceto para verificar a existência da função de banco de dados
especificada).
Note, também, que essa forma do comando não permite a palavra
ruído GROUP
em
grupamento
.
Um usuário só pode revogar privilégios que foram concedidos
diretamente por esse usuário.
Se, por exemplo, o usuário A
concedeu um privilégio
com opção de concessão ao usuário B
, e o usuário
B
, por sua vez, o concedeu ao usuário
C
, o usuário A
não pode revogar
o privilégio de C
diretamente.
Em vez disso, o usuário A
pode revogar a opção de
concessão do usuário B
, e usar a opção
CASCADE
para que o privilégio seja revogado do
usuário C
.
Para outro exemplo, se A
e B
concederam o mesmo privilégio a C
, então
A
pode revogar sua própria concessão, mas não a
concessão de B
, portanto C
ainda terá o privilégio.
Quando um não-dono de um objeto tenta revogar os privilégios no
objeto, o comando irá falhar por completo se o usuário não tiver
nenhum privilégio no objeto.
Enquanto estiver disponível algum privilégio, o comando irá
prosseguir, mas revogando apenas os privilégios para os quais o
usuário tem opção de concessão.
As formas de REVOKE ALL PRIVILEGES
mostram uma
mensagem de advertência se nenhuma opção de concessão estiver presente,
enquanto as outras formas mostram uma advertência se a opção de
concessão, para qualquer um dos privilégios especificamente
indicados no comando, não estiver presente.
(Em princípio, essas afirmações também se aplicam ao dono do objeto,
mas como o dono é sempre tratado como detentor de todas as opções
de concessão, os casos nunca podem ocorrer.)
Se um superusuário escolher executar o comando GRANT
ou REVOKE
, o comando será executado como se tivesse
sido executado pelo dono do objeto afetado.
Como todos os privilégios vêm do dono do objeto
(possivelmente indiretamente por meio de cadeias de opção de concessão),
é possível para um superusuário revogar todos os privilégios, mas
isso pode requerer o uso de CASCADE
conforme
visto acima.
O comando REVOKE
também pode ser executado por
uma função de banco de dados (role)
que não é a dona do objeto afetado, mas é membro da função que possui
o objeto, ou é membro de uma função que possui privilégios
WITH GRANT OPTION
no objeto.
Nesse caso, o comando é executado como se tivesse sido executado pela
função que realmente possui o objeto, ou detém os privilégios
WITH GRANT OPTION
.
Por exemplo, se a tabela t1
pertencer à
função de banco de dados g1
,
da qual a função u1
é membro,
então u1
pode revogar os privilégios em
t1
registrados como tendo sido concedidos por
g1
.
Isso incluiria as concessões feitas por u1
,
bem como por outros membros da função de banco de dados
g1
.
Se a função de banco de dados que executa o comando
REVOKE
detiver os privilégios necessários
indiretamente, por meio de mais de um caminho para se tornar membro
da função de banco de dados, não será especificada qual
função de banco de dados contendo o privilégio será registrada
como tendo executado o comando.
Nesses casos, é uma prática recomendada usar o comando
SET ROLE
para se tornar a função de banco de
dados específica pela qual se deseja executar o comando
REVOKE
.
Deixar de fazer isso pode levar à revogação de privilégios
diferentes dos pretendidos, ou levar a não revogar nada.
Veja Privilégios para obter mais informações sobre tipos específicos de privilégios, bem como sobre como inspecionar os privilégios dos objetos.
Revogar o privilégio de inserção para PUBLIC
na tabela films
:
REVOKE INSERT ON films FROM PUBLIC;
Revogar todos os privilégios do usuário manuel
na visão kinds
:
REVOKE ALL PRIVILEGES ON kinds FROM manuel;
Note que isso realmente significa “revogar todos os privilégios que eu concedi”.
Revogar o usuário joe
ser membro da
função de banco de dados admins
:
REVOKE admins FROM joe;
As notas de compatibilidade do comando GRANT
se aplicam de forma análoga a REVOKE
.
As palavras-chave RESTRICT
ou
CASCADE
são obrigatórias segundo o padrão
SQL, mas o PostgreSQL
assume RESTRICT
por padrão.
[221]
Use o comando REVOKE
para:
revogar privilégios de sistema de usuários e de
funções de banco de dados (roles);
revogar funções de banco de dados de usuários, de funções de banco
de dados, e de unidades de programa;
revogar privilégios de objeto, para um determinado objeto, de
usuários e de funções de banco de dados.
Oracle 21 – REVOKE (N. T.)
[222]
O comando REVOKE
permite que usuários autorizados
revoguem privilégios concedidos anteriormente a outros usuários.
IBM DB2 11.5 – Revoking privileges (N. T.)