REVOKE

REVOKE — remove privilégios de acesso

Sinopse

REVOKE [ GRANT OPTION FOR ]
    { { SELECT
      | INSERT
      | UPDATE
      | DELETE
      | TRUNCATE
      | REFERENCES
      | TRIGGER
      | MAINTAIN
      }
      [, ...]
      | ALL [ PRIVILEGES ]
    }
    ON { [ TABLE ] nome_da_tabela [, ...]
         | ALL TABLES IN SCHEMA nome_do_esquema [, ...]
       }
    FROM especificação_da_role [, ...]
    [ GRANTED BY especificação_da_role ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT
      | INSERT
      | UPDATE
      | REFERENCES
      }
      ( nome_da_coluna [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( nome_da_coluna [, ...] ) }
    ON [ TABLE ] nome_da_tabela [, ...]
    FROM especificação_da_role [, ...]
    [ GRANTED BY especificação_da_role ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { USAGE
      | SELECT
      | UPDATE
      }
      [, ...]
      | ALL [ PRIVILEGES ]
    }
    ON { SEQUENCE nome_da_sequência [, ...]
         | ALL SEQUENCES IN SCHEMA nome_do_esquema [, ...] }
    FROM especificação_da_role [, ...]
    [ GRANTED BY especificação_da_role ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE
      | CONNECT
      | TEMPORARY
      | TEMP
      }
      [, ...]
      | ALL [ PRIVILEGES ]
    }
    ON DATABASE nome_do_banco_de_dados [, ...]
    FROM especificação_da_role [, ...]
    [ GRANTED BY especificação_da_role ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON DOMAIN nome_do_domínio [, ...]
    FROM especificação_da_role [, ...]
    [ GRANTED BY especificação_da_role ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN DATA WRAPPER nome_do_empacotador [, ...]
    FROM especificação_da_role [, ...]
    [ GRANTED BY especificação_da_role ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER nome_do_servidor [, ...]
    FROM especificação_da_role [, ...]
    [ GRANTED BY especificação_da_role ]
    [ 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 SCHEMA nome_do_esquema [, ...]
       }
    FROM especificação_da_role [, ...]
    [ GRANTED BY especificação_da_role ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE nome_da_linguagem [, ...]
    FROM especificação_da_role [, ...]
    [ GRANTED BY especificação_da_role ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECT id_de_objeto_grande [, ...]
    FROM especificação_da_role [, ...]
    [ GRANTED BY especificação_da_role ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SET | ALTER SYSTEM } [, ...] | ALL [ PRIVILEGES ] }
    ON PARAMETER parâmetro_de_configuração [, ...]
    FROM especificação_da_role [, ...]
    [ GRANTED BY especificação_da_role ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA nome_do_esquema [, ...]
    FROM especificação_da_role [, ...]
    [ GRANTED BY especificação_da_role ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE nome_do_espaço_de_tabelas [, ...]
    FROM especificação_da_role [, ...]
    [ GRANTED BY especificação_da_role ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE nome_do_tipo_de_dados [, ...]
    FROM especificação_da_role [, ...]
    [ GRANTED BY especificação_da_role ]
    [ CASCADE | RESTRICT ]

REVOKE [ { ADMIN | INHERIT | SET } OPTION FOR ]
    nome_da_role [, ...]
    FROM especificação_da_role [, ...]
    [ GRANTED BY especificação_da_role ]
    [ CASCADE | RESTRICT ]

onde especificação_da_role pode ser:

    [ GROUP ] nome_da_role
  | PUBLIC
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER

Descrição

O comando REVOKE revoga privilégios concedidos anteriormente a uma ou mais funções de banco de dados (roles) [152] [153]. 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 este 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 estes 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, estes privilégios dependentes também serão revogados se for especificado CASCADE; se não for especificado, a ação de revogar irá falhar. Esta 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 a participação em uma função de banco de dados, GRANT OPTION passa a se chamar ADMIN OPTION, mas o comportamento é semelhante. Note que, nas versões anteriores ao PostgreSQL 16, os privilégios dependentes não eram rastreados para concessões de participação em funções de banco de dados e, portanto, CASCADE não tinha efeito na participação em funções de banco de dados. Isto já não acontece mais. Note também que esta forma do comando não permite a palavra ruído GROUP na especificação_da_role.

Assim como o privilégio ADMIN OPTION pode ser revogado para uma função de banco de dados existente, também é possível revogar INHERIT OPTION ou SET OPTION. Isto equivale a definir o valor da opção correspondente como FALSE.

Notas

Um usuário só pode revogar privilégios que foram concedidos diretamente por este 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, estas 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 as funções de banco de dados não têm donos, no caso de um comando GRANT de associação a uma função de banco de dados, o comando é executado como se tivesse sido submetido pelo superusuário de inicialização.) Como todos os privilégios provêm, em última instância, do dono do objeto (possivelmente de forma indireta por meio de cadeias de opções de concessão), é possível que um superusuário revogue todos os privilégios, mas isto pode exigir o uso de CASCADE, conforme mencionado 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. Neste 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. Isto 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 isto 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.

Exemplos

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 isto 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;

Conformidade

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.

Veja também

GRANT, ALTER DEFAULT PRIVILEGES


[152] 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.)

[153] O comando REVOKE permite que usuários autorizados revoguem privilégios concedidos anteriormente a outros usuários. IBM DB2 12.1.x – Revoking privileges (N. T.)