O comando GRANT concede permissões específicas no objeto (tabela, visão, seqüência) para um ou mais usuários ou grupos de usuário. Estas permissões são adicionadas às já concedidas, caso existam.
A palavra chave PUBLIC indica que o privilégio deve ser concedido para todos os usuários, inclusive aos que vierem a ser criado posteriormente. PUBLIC pode ser considerado como um grupo implicitamente definido que sempre inclui todos os usuários. Observe que qualquer usuário em particular possui a soma dos privilégios concedidos diretamente para o mesmo, mais os privilégios concedidos para qualquer grupo do qual seja membro, mais os privilégios concedidos para PUBLIC.
Os usuários, fora o criador do objeto, não possuem nenhum privilégio de acesso ao objeto a menos que o criador conceda as permissões. Não existe nenhuma necessidade de se conceder privilégios ao criador do objeto, porque o criador automaticamente possui todos os privilégios (O criador pode, entretanto, decidir revogar alguns de seus próprios privilégios por motivo de segurança. Observe que esta capacidade de conceder e revogar privilégios é inerente ao criador, não podendo ser perdida. O direito de eliminar o objeto é da mesma forma inerente ao criador, não podendo ser concedido ou revogado).
Os privilégios possíveis são:
Permite consultar qualquer coluna (SELECT) da tabela, visão ou seqüência especificada. Também permite utilizar o comando COPY FROM.
Permite incluir novas linhas (INSERT) na tabela especificada. Também permite utilizar o comando COPY TO.
Permite modificar os dados de qualquer coluna (UPDATE) da tabela especificada. O comando SELECT ... FOR UPDATE também requer este privilégio (além do privilégio SELECT ). Para as seqüências, este privilégio permite o uso de nextval, currval e setval.
Permite excluir linhas (DELETE) da tabela especificada.
Permite criar regras para a tabela ou para a visão (Consulte o comando CREATE RULE ).
Para criar uma tabela com restrição de chave estrangeira é necessário possuir este privilégio na tabela com a chave referenciada.
Permite criar gatilhos na tabela especificada (Consulte o comando CREATE TRIGGER).
Concede todos os privilégios mostrados acima de uma só vez. A palavra chave PRIVILEGES é opcional no PostgreSQL, entretanto é requerida pelo SQL estrito.
Os privilégios requeridos pelos outros comandos estão listados nas páginas de referência dos respectivos comandos.
Deve-se notar que os superusuários do banco de dados podem acessar todos os objetos a despeito dos privilégios definidos. Este comportamento é comparável aos direitos do usuário root no sistema Unix. Assim como o root, não é aconselhável operar como um superusuário, exceto quando for absolutamente necessário.
Atualmente para conceder privilégios somente para algumas colunas deve-se criar uma visão possuindo as colunas desejadas e conceder os privilégios para esta visão.
Use o comando \z do psql para obter informações sobre os privilégios concedidos nos objetos existentes:
Database = lusitania
+------------------+---------------------------------------------+
| Relation | Grant/Revoke Permissions |
+------------------+---------------------------------------------+
| mytable | {"=rw","miriam=arwdRxt","group todos=rw"} |
+------------------+---------------------------------------------+
Legend:
uname=arwR -- privileges granted to a user
group gname=arwR -- privileges granted to a group
=arwR -- privileges granted to PUBLIC
r -- SELECT ("read")
w -- UPDATE ("write")
a -- INSERT ("append")
d -- DELETE
R -- RULE
x -- REFERENCES
t -- TRIGGER
arwdRxt -- ALL PRIVILEGES
O comando REVOKE é utilizado para revogar os privilégios de acesso.
Conceder, para todos os usuários, o privilégio de inserir na tabela filmes:
GRANT INSERT ON filmes TO PUBLIC;
Conceder todos os privilégios ao usuário manuel na visão tipos:
GRANT ALL PRIVILEGES ON tipos TO manuel;
A palavra chave PRIVILEGES em ALL PRIVILEGES é requerida. O SQL não aceita a concessão de privilégios em mais de uma tabela no mesmo comando.
A sintaxe do SQL92 para o comando GRANT permite conceder privilégios individuais para as colunas da tabela, e permite conceder o privilégio de conceder o mesmo privilégio para outros:
GRANT privilégio [, ...]
ON objeto [ ( coluna [, ...] ) ] [, ...]
TO { PUBLIC | nome_do_usuário [, ...] } [ WITH GRANT OPTION ]
O SQL permite conceder o privilégio USAGE em outros tipos de objeto: CHARACTER SET, COLLATION, TRANSLATION, DOMAIN.
O privilégio TRIGGER foi introduzido no SQL99. O privilégio RULE é uma extensão do PostgreSQL.