REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] nome_da_tabela [, ...] FROM { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] } ON SEQUENCE nome_da_seqüência [, ...] FROM { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE nome_do_banco_de_dados [, ...] FROM { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION nome_da_função ( [ [ modo_do_argumento ] [ nome_do_argumento ] tipo_do_argumento [, ...] ] ) [, ...] FROM { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE nome_da_linguagem [, ...] FROM { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA nome_do_esquema [, ...] FROM { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE nome_do_espaço_de_tabelas [, ...] FROM { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ ADMIN OPTION FOR ] role [, ...] FROM nome_do_usuário [, ...] [ CASCADE | RESTRICT ]
O comando REVOKE revoga, de um ou mais papéis, privilégios concedidos anteriormente. A palavra chave PUBLIC se refere ao grupo contendo todos os usuários, definido implicitamente.
O significado dos tipos de privilégio deve ser visto na descrição do comando GRANT.
Deve ser observado que um determinado papel possui a soma dos privilégios concedidos diretamente para o próprio papel, mais os privilégios concedidos para os papéis dos quais o papel é membro no momento, mais os privilégios concedidos para PUBLIC. Daí, por exemplo, revogar o privilégio SELECT de PUBLIC não significa, necessariamente, que todos os papéis perderão o privilégio SELECT para o objeto: os papéis que receberam o privilégio diretamente, ou através de outro papel, ainda terão o privilégio.
Se for especificado GRANT OPTION FOR somente a opção de concessão do privilégio é revogada, e não o próprio privilégio. Caso contrário, tanto o privilégio quanto a opção de concessão serão revogados.
Se o usuário possui um privilégio com opção de concessão, e concedeu este privilégio para outros usuários, então os privilégios que estes outros usuários possuem são chamados de privilégios dependentes. Se o privilégio ou a opção de concessão que o primeiro usuário possui for revogada, e existirem privilégios dependentes, estes privilégios dependentes também serão revogados se for especificado CASCADE, senão a ação de revogar falhará. Esta revogação recursiva somente afeta os privilégios que foram concedidos através de uma cadeia de usuários começando pelo usuário objeto deste comando REVOKE. Portanto, os usuários afetados poderão manter o privilégio, se o privilégio também tiver sido concedido por outros usuários.
Ao revogar o privilégio de membro de um papel, GRANT OPTION passa a se chamar ADMIN OPTION, mas o comportamento é semelhante. Deve ser observado, também, que esta forma do comando não inclui a palavra GROUP.
Para ver os privilégios concedidos para os objetos existentes pode ser utilizado o comando \z do aplicativo psql. Para obter informações sobre o formato deve ser consultado o comando GRANT.
Um determinado usuário pode revogar somente os 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 para o usuário B, e o usuário B por sua vez concedeu o privilégio para o usuário C, então o usuário A não poderá revogar diretamente o privilégio de C. Em vez disso, o usuário A poderá revogar a opção de concessão do usuário B usando a opção CASCADE, para que o privilégio seja, por sua vez, revogado do usuário C. Outro exemplo é o caso em que tanto A quanto B concederam o mesmo privilégio a C: neste caso A poderá revogar sua própria concessão, mas não poderá revogar a concessão feita por B e, portanto, C continuará com o privilégio mesmo que A revogue o privilégio.
Se alguém que não for dono do objeto tentar revogar privilégios sobre o objeto, o comando falhará inteiramente caso o usuário não possua ao menos um privilégio para o objeto. Se o usuário possuir algum privilégio para o objeto o comando prosseguirá, mas só revogará os privilégios para os quais o usuário tem a opção de concessão. A forma REVOKE ALL PRIVILEGES emite uma mensagem de advertência quando o usuário não possui ao menos uma opção de concessão, enquanto as outras formas emitem uma mensagem de advertência quando o usuário não possui opção de concessão para algum dos privilégios especificamente identificados no comando (Em princípio estas informações também se aplicam ao dono do objeto, mas como o dono é sempre tratado como possuindo todas as opções de concessão estes casos nunca ocorrem).
Se um superusuário decidir submeter o comando GRANT ou REVOKE, o comando será executado como se tivesse sido submetido pelo dono do objeto afetado. Uma vez que todos os privilégios partem do dono do objeto (possivelmente de forma indireta através de cadeias de opções de concessão), um superusuário pode revogar todos os privilégios, mas pode ser necessário usar CASCADE conforme mostrado acima.
O comando REVOKE também pode ser submetido por um papel que não é o dono do objeto afetado, mas é membro do papel que é dono do objeto, ou é um membro de um papel que possui privilégios com WITH GRANT OPTION no objeto. Neste caso, o comando será executado como se tivesse sido emitido pelo papel que realmente possui o objeto ou possui privilégios com WITH GRANT OPTION. Por exemplo, se a tabela t1 pertencer ao papel g1, do qual o papel u1 é membro, então u1 poderá revogar privilégios sobre t1 registrados como tendo sido concedidos por g1. Isto inclui concessões feitas por u1 assim como por qualquer outro membro do papel g1.
Se o papel que está executando o comando REVOKE possuir os privilégios requeridos indiretamente, através de um caminho de membro de mais de um papel, é incerto qual dos papéis será registrado como tendo executado o comando. Nestes casos, a melhor prática é utilizar o comando SET ROLE para assumir o papel específico com o qual se deseja executar o comando REVOKE. Caso isto não seja feito, poderá resultar na revogação de privilégios além dos pretendidos, ou até em não revogar nada.
Revogar o privilégio de inserção na tabela filmes concedido para todos os usuários:
REVOKE INSERT ON filmes FROM PUBLIC;
Revogar todos os privilégios concedidos ao usuário manuel sobre a visão vis_tipos:
REVOKE ALL PRIVILEGES ON vis_tipos FROM manuel;
Deve ser observado que este comando significa, na verdade, "revogue todos os privilégios que eu concedi".
Revogar o privilégio de ser membro do papel admins ao usuário joel:
REVOKE admins FROM joel;
As notas sobre compatibilidade presentes no comando GRANT se aplicam de forma análoga ao comando REVOKE. O sumário da sintaxe é:
REVOKE [ GRANT OPTION FOR ] privilégios ON objeto [ ( coluna [, ...] ) ] FROM { PUBLIC | nome_do_usuário [, ...] } { RESTRICT | CASCADE }
De acordo com o padrão é necessário RESTRICT ou CASCADE, mas o PostgreSQL assume RESTRICT por padrão.