GRANT

Nome

GRANT -- define privilégios de acesso

Sinopse

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 ]

Descrição

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:

SELECT
Permite consultar ( SELECT ) qualquer coluna da tabela, visão ou seqüência especificada. Também permite utilizar o comando COPY TO. Para as seqüências, este privilégio também permite o uso da função currval.
INSERT
Permite inserir ( INSERT ) novas linhas na tabela especificada. Também permite utilizar o comando COPY FROM.
UPDATE
Permite modificar ( UPDATE ) os dados de qualquer coluna 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 das funções nextval e setval.
DELETE
Permite excluir ( DELETE ) linhas da tabela especificada.
RULE
Permite criar regras para a tabela ou para a visão (Consulte o comando CREATE RULE ).
REFERENCES
Para criar uma restrição de chave estrangeira é necessário possuir este privilégio, tanto na tabela que faz referência quanto na tabela que é referenciada.
TRIGGER
Permite criar gatilhos na tabela especificada (Consulte o comando CREATE TRIGGER ).
CREATE
Para bancos de dados, permite a criação de novos esquemas no banco de dados. Para esquemas, permite a criação de novos objetos no esquema. Para mudar o nome de um objeto existente é necessário ser o dono do objeto e possuir este privilégio no esquema que o contém.
TEMPORARY
TEMP
Permite a criação de tabelas temporárias ao usar o banco de dados.
EXECUTE
Permite utilizar a função especificada e qualquer operador implementado por cima da função. Este é o único tipo de privilégio aplicável às funções (Esta sintaxe funciona para as funções de agregação, da mesma forma).
USAGE
Para as linguagens procedurais, permite o uso da linguagem especificada para criar funções nesta linguagem. Este é o único tipo de privilégio aplicável às linguagens procedurais. Para os esquemas, permite acessar os objetos contidos no esquema especificado (assumindo que os privilégios requeridos para os próprios objetos estejam atendidos). Essencialmente, permite a quem recebe a concessão "procurar" por objetos dentro do esquema.
ALL PRIVILEGES
Concede todos os privilégios disponíveis de uma só vez. A palavra chave PRIVILEGES é opcional no PostgreSQL, embora seja requerida pelo SQL estrito.

Os privilégios requeridos por outros comandos estão listados nas páginas de referência dos respectivos comandos.

Observações

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.

Exemplos

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;

Compatibilidade

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.

Veja também

REVOKE

Notas

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

SourceForge.net Logo