GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] nome_da_tabela [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE nome_bd [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION funcname ([tipo, ...]) [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE nome_da_linguagem [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA nome_do_esquema [, ...] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ]
O comando GRANT concede privilégios específicos para um objeto (tabela, visão, seqüência, banco de dados, função, linguagem procedural ou esquema) para um ou mais usuários ou grupos de usuários. Estes privilégios são adicionados aos já concedidos, 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 criados posteriormente. PUBLIC pode ser considerado como um grupo definido implicitamente que sempre inclui todos os usuários. Um determinado usuário possui a soma dos privilégios concedidos diretamente para o mesmo, mais os privilégios concedidos para todos os grupos que este seja membro, mais os privilégios concedidos para PUBLIC.
Se for especificado WITH GRANT OPTION quem recebe o privilégio pode, por sua vez, conceder o privilégio a outros. Por padrão, isto não é permitido. Opções de concessão podem ser concedidas apenas a usuários específicos, e não a grupos ou PUBLIC.
Não existe necessidade de conceder privilégios para o dono do objeto (geralmente o usuário que o criou), porque o dono possui todos os privilégios por padrão (Entretanto, o dono pode decidir revogar alguns de seus próprios privilégios por motivo de segurança). O direito de remover um objeto, ou de alterar a sua definição de alguma forma, não é descrito por um privilégio que possa ser concedido; é inerente ao dono e não pode ser concedido ou revogado. Também não é possível revogar as opções de conceder do dono.
Dependendo do tipo do objeto, os privilégios iniciais padrão podem incluir a concessão de alguns privilégios para PUBLIC. O padrão é: não permitir o acesso público para tabelas e esquemas; privilégio de criação de tabela TEMP para bancos de dados; privilégio EXECUTE para funções; e privilégio USAGE para linguagens. O dono do objeto pode, é claro, revogar estes privilégios (para a máxima segurança deve ser executado o comando REVOKE na mesma transação que criar o objeto; dessa forma não haverá tempo para que outro usuário possa usar o objeto).
Os privilégios possíveis são:
currval
.
nextval
e setval
.
Os privilégios requeridos por outros comandos estão listados nas páginas de referência dos respectivos comandos.
O comando REVOKE é utilizado para revogar privilégios de acesso.
Deve ser observado que os superusuários do banco de dados podem acessar todos os objetos, sem considerar os privilégios definidos para o objeto. Isto é comparável aos direitos do usuário root no sistema operacional Unix. Assim como no caso do root, não é aconselhável operar como um superusuário a não ser quando for absolutamente necessário.
Se um superusuário decidir executar o comando GRANT ou o comando REVOKE, o comando é executado como se tivesse sido executado pelo dono do objeto afetado. Em particular, os privilégio concedidos através deste comando aparecem como se tivessem sido concedidos pelo dono do objeto.
Atualmente o PostgreSQL não suporta conceder ou revogar privilégios para colunas individuais da tabela. Uma forma possível de transpor esta limitação é criar uma visão possuindo apenas as colunas desejadas e, então, conceder os privilégios para a visão.
Pode ser usado o comando \z da aplicação psql para obter informações sobre os privilégios concedidos como, por exemplo:
=> \z minha_tabela Access privileges for database "lusitania" Schema | Table | Access privileges --------+--------------+--------------------------------------- public | minha_tabela | {=r/postgres,miriam=arwdRxt/postgres,"group todos=arw/postgres"} (1 linha)
As entradas mostradas pelo comando \z são interpretadas da seguinte forma:
=xxxx -- privilégios concedidos para PUBLIC uname=xxxx -- privilégios concedidos para o usuário group gname=xxxx -- privilégios concedidos para o grupo r -- SELECT ("read") w -- UPDATE ("write") a -- INSERT ("append") d -- DELETE R -- RULE x -- REFERENCES t -- TRIGGER X -- EXECUTE U -- USAGE C -- CREATE T -- TEMPORARY arwdRxt -- ALL PRIVILEGES (para tabelas) * -- opção de concessão para o privilégio precedente /yyyy -- usuário que concedeu este privilégio
O exemplo mostrado acima seria visto pela usuária miriam após esta ter criado a tabela minha_tabela e executado:
GRANT SELECT ON minha_tabela TO PUBLIC; GRANT SELECT, UPDATE, INSERT ON minha_tabela TO GROUP todos;
Se a coluna "Access privileges" estiver vazia para um determinado objeto, isto significa que o objeto possui os privilégios padrão (ou seja, suas colunas de privilégio são nulas). Os privilégios padrão sempre incluem todos os privilégios para o dono, e podem incluir alguns privilégios para PUBLIC dependendo do tipo do objeto, como foi explicado acima. O primeiro comando GRANT ou REVOKE em um objeto cria uma instância dos privilégios padrão (produzindo, por exemplo, {=,miriam=arwdRxt}) e, em seguida, modifica esta instância de acordo com a solicitação especificada.
Conceder, para todos os usuários, o privilégio de inserção na tabela filmes:
GRANT INSERT ON filmes TO PUBLIC;
Conceder para o usuário manuel todos os privilégios disponíveis na visão tipos:
GRANT ALL PRIVILEGES ON tipos TO manuel;
De acordo com o padrão SQL, a palavra chave PRIVILEGES em ALL PRIVILEGES é requerida. O padrão SQL não suporta definir privilégios para mais de um objeto por comando.
O padrão SQL permite definir privilégios para as colunas individuais da tabela:
GRANT privilégios ON tabela [ ( coluna [, ...] ) ] [, ...] TO { PUBLIC | nome_do_usuário [, ...] } [ WITH GRANT OPTION ]
O padrão SQL permite conceder o privilégio USAGE em outros tipos de objeto: conjuntos de caracteres, classificações (collations [1] ), traduções e domínios.
O privilégio RULE, e os privilégios para bancos de dados, esquemas, linguagens e seqüências são extensões do PostgreSQL.
[1] |
collation; collating sequence — Um método para comparar duas cadeias de caracteres comparáveis. Todo conjunto de caracteres possui seu collation padrão. (Second Informal Review Draft) ISO/IEC 9075:1992, Database Language SQL- July 30, 1992. (N. do T.) |