GRANT

Nome

GRANT -- define privilégios de acesso

Sinopse

GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON [ TABLE ] nome_da_tabela [, ...]
    TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { { USAGE | SELECT | UPDATE }
    [,...] | ALL [ PRIVILEGES ] }
    ON SEQUENCE nome_da_seqüência [, ...]
    TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE nome_do_banco_de_dados [, ...]
    TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON FUNCTION nome_da_função ( [ [ modo_do_argumento ] [ nome_do_argumento ] tipo_do_argumento [, ...] ] ) [, ...]
    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 ]

GRANT { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE nome_do_espaço_de_tabelas [, ...]
    TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT role [, ...] TO nome_do_usuário [, ...] [ WITH ADMIN OPTION ]

Descrição

O comando GRANT possui duas funcionalidades básicas: conceder privilégios para um objeto do banco de dados (tabela, visão, seqüência, banco de dados, função, linguagem procedural, esquema e espaço de tabelas), e conceder o privilégio de ser membro de um papel. Estas duas funcionalidades são semelhantes em muitos aspectos, mas são suficientemente diferentes para serem descritas em separado. [1] [2] [3] [4]

A partir do PostgreSQL 8.1 os conceitos de usuário e de grupo foram unificados em um único tipo de entidade chamada de papel. Portanto, não é mais necessário utilizar a palavra chave GROUP para identificar se quem está recebendo a concessão é um usuário ou um grupo. A palavra chave GROUP ainda é permitida neste comando, mas não produz nenhum efeito.

Concessões em objetos do banco de dados

Esta funcionalidade do comando GRANT concede privilégios específicos sobre um objeto do banco de dados para um ou mais papéis. Estes privilégios são adicionados aos já existentes, caso haja algum.

A palavra chave PUBLIC indica que os privilégios devem ser concedido para todos os papéis, inclusive aos que vierem a ser criados posteriormente. PUBLIC pode ser considerado como um grupo definido implicitamente que sempre inclui todos os papéis. Um determinado papel possui a soma dos privilégios concedidos diretamente para o mesmo, mais os privilégios concedidos para todos os papéis que este seja membro, mais os privilégios concedidos para PUBLIC.

Se for especificado WITH GRANT OPTION quem receber o privilégio poderá, por sua vez, conceder o privilégio a terceiros. Sem a opção de concessão, quem recebe não pode conceder o privilégio. A opção de concessão não pode ser concedida para PUBLIC.

Não é necessário 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. O dono possui também, implicitamente, todas as opções de concessão para o objeto.

Dependendo do tipo do objeto, os privilégios padrão iniciais podem incluir a concessão de alguns privilégios para PUBLIC. O padrão é: não permitir o acesso público às tabelas, esquemas e espaços de tabelas; para os bancos de dados conceder o privilégio CONNECT e o privilégio de criação de tabela TEMP; para as funções conceder o privilégio EXECUTE; e para as linguagens conceder o privilégio USAGE. O dono do objeto poderá, é claro, revogar estes privilégios (para a máxima segurança o comando REVOKE deverá ser executado na mesma transação que criar o objeto; dessa forma não haverá espaço de tempo para outro usuário utilizar 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. Os comandos SELECT ... FOR UPDATE e SELECT ... FOR SHARE também requerem 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.

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.

Para espaços de tabelas, permite a criação de tabelas e índices no espaço de tabelas, e permite a criação de bancos de dados possuindo este espaço de tabelas como seu espaço de tabelas padrão (Deve ser observado que revogar este privilégio não altera a colocação dos objetos existentes).

CONNECT

Permite ao usuário se conectar ao banco de dados especificado. Este privilégio é verificado no estabelecimento da conexão (além de serem verificadas as restrições impostas por pg_hba.conf).

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 utilizando a função. Este é o único tipo de privilégio aplicável às funções (Esta sintaxe funciona para as funções de agregação também).

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, concede a quem recebe o direito de "procurar" por objetos dentro do esquema. Sem esta permissão ainda é possível ver os nomes dos objetos, por exemplo consultando as tabelas do sistema. Além disso, após esta permissão ter sido revogada os servidores existentes poderão conter comandos que realizaram anteriormente esta procura, portanto esta não é uma forma inteiramente segura de impedir o acesso aos objetos.

Para as seqüências este privilégio permite a utilização das funções currval e nextval.

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.

Concessões em papéis

Esta funcionalidades do comando GRANT concede a um ou mais papéis o privilégio de se tornar membro de um papel. Ser membro de um papel é significativo, porque o papel transmite os privilégios recebidos para cada um de seus membros.

Se for especificada a opção WITH ADMIN OPTION, o membro poderá por sua vez conceder o privilégio de ser membro a terceiros, e também revogar o privilégio de ser membro. Sem esta opção, os usuários comuns não poderão fazer isto. Entretanto, os superusuários do banco de dados podem conceder ou revogar o privilégio de ser membro a qualquer um. Os papéis que possuem o privilégio CREATEROLE podem conceder ou revogar o privilégio de ser membro em qualquer papel que não seja superusuário.

Diferentemente do caso dos privilégios, ser membro de um papel não pode ser concedido para PUBLIC. Deve ser observado, também, que esta forma do comando não inclui a palavra GROUP.

Observações

O comando REVOKE é utilizado para revogar os privilégios de acesso.

Quando alguém que não é o dono do objeto tenta conceder privilégios para o objeto, o comando falha 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ó concederá os privilégios para os quais o usuário tem a opção de concessão. A forma GRANT 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).

Deve ser observado que os superusuários do banco de dados podem acessar todos os objetos, independentemente dos 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 submeter o comando GRANT ou REVOKE, o comando será executado como se tivesse sido submetido pelo dono do objeto afetado. Em particular, os privilégio concedidos através deste comando aparecerão como se tivessem sido concedidos pelo dono do objeto (Para o privilégio de membro de um papel irá aparecer como se tivesse sido concedido pelo próprio papel).

As concessões e revogações também podem ser realizadas 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. Nestes casos, os privilégios serão registrados como tendo sido concedidos pelo papel que realmente possui o objeto, ou possui os 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á conceder privilégios sobre t1 para u2, mas estes privilégio aparecerão como se tivessem sido concedidos diretamente por g1. Um outro membro do papel g1 poderá revogar o privilégio posteriormente.

Se o papel que está executando o comando GRANT 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 feito a concessão. Nestes casos, a melhor prática é utilizar o comando SET ROLE para especificar o papel através do qual se deseja fazer a concessão.

Conceder permissão para uma tabela não estende automaticamente a permissão para as seqüências utilizadas pela tabela, inclusive as seqüências ligadas às colunas SERIAL. As permissões para as seqüências devem ser definidas em separado.

Atualmente o PostgreSQL não suporta conceder ou revogar privilégios para as colunas da tabela individualmente. Uma forma possível de contornar esta limitação é criando uma visão contendo apenas as colunas desejadas e, então, conceder os privilégios para a visão.

Pode ser usado o comando \z do aplicativo psql para obter informações sobre os privilégios concedidos como, por exemplo:

=> \z minha_tabela

                       Privilégios de acesso ao banco dados "lusitania"
 Esquema |     Nome     |  Tipo  |                   Privilégios de acesso
---------+--------------+--------+------------------------------------------------------------
 public  | minha_tabela | tabela | {miriam=arwdRxt/miriam,=r/miriam,"group todos=arw/miriam"}
(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
                  x -- REFERENCES
                  t -- TRIGGER
                  X -- EXECUTE
                  U -- USAGE
                  C -- CREATE
                  c -- CONNECT
                  T -- TEMPORARY
             arwdxt -- ALL PRIVILEGES (para tabelas)
                  * -- opção de concessão para o privilégio precedente

              /yyyy -- usuário que concedeu o 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, sua coluna de privilégios é nula). 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-os de acordo com a solicitação especificada.

Deve ser observado que as opções de concessão implícitas do dono não são marcadas na visualização dos privilégios de acesso. O * aparece somente quando as opções de concessão foram concedidas explicitamente para alguém.

Exemplos

Conceder, para todos os usuários, o privilégio de inserção na tabela filmes:

GRANT INSERT ON filmes TO PUBLIC;

Conceder ao usuário manuel todos os privilégios disponíveis na visão vis_tipos:

GRANT ALL PRIVILEGES ON vis_tipos TO manuel;

Deve ser observado que, embora o comando acima realmente concederá todos os privilégios se for executado por um superusuário ou pelo dono da visão vis_tipos, se for executado por outra pessoa somente concederá as permissões para as quais esta outra pessoa tiver a opção de conceder o privilégio a terceiros.

Conceder o privilégio de ser membro do papel admins ao usuário joel:

GRANT admins TO joel;

Compatibilidade

De acordo com o padrão SQL, a palavra chave PRIVILEGES em ALL PRIVILEGES é requerida. O padrão SQL não permite definir privilégios para mais de um objeto por comando.

O PostgreSQL permite ao dono do objeto revogar seus próprios privilégios ordinários: por exemplo, o dono da tabela pode tornar a tabela somente de leitura para ele mesmo revogando seus próprios privilégios de INSERT, UPDATE e DELETE. De acordo com o padrão SQL isto não é possível. A razão é que o PostgreSQL trata os privilégios do dono como tendo sido concedidos pelo dono para ele mesmo; portanto ele também pode revogá-los. No padrão SQL os privilégios do dono são concedidos pela entidade assumida "_SYSTEM". Em não sendo o "_SYSTEM", o dono não pode revogar estes direitos.

O padrão SQL permite definir privilégios para as colunas da tabela individualmente:

GRANT privilégios
    ON tabela [ ( coluna [, ...] ) ] [, ...]
    TO { PUBLIC | nome_do_usuário [, ...] } [ WITH GRANT OPTION ]

O padrão SQL estabelece o privilégio USAGE para outros tipos de objeto: conjuntos de caracteres, intercalações (collations [5] [6] [7] [8] ), traduções e domínios.

Os privilégios para bancos de dados, espaços de tabelas e linguagens são extensões do PostgreSQL.

Consulte também

REVOKE

Notas

[1]

Oracle — O comando GRANT é utilizado para conceder: Privilégios de sistema para usuários e papéis; Papéis para usuários e papéis (Tanto os privilégios quanto os papéis são locais, globais ou externos); Privilégios de objeto para um objeto em particular para usuários, papéis e PUBLIC. Oracle® Database SQL Reference 10g Release 1 (10.1) Part Number B10759-01 (N. do T.)

[2]

Oracle — A autorização inclui basicamente dois processos: permitir somente certos usuários acessar, processar ou alterar dados; aplicar limitações variadas aos acessos ou ações dos usuários. As limitações colocadas (ou removidas) dos usuários podem ser aplicadas a objetos, como esquemas, tabelas ou linhas; ou a recursos como tempo (CPU, conexão ou ociosidade). O privilégio é o direito de executar um determinado tipo de instrução SQL ou de acessar o objeto de outro usuário. Alguns exemplos de privilégios incluem o direito de: conectar ao banco de dados (criar uma sessão); criar uma tabela; selecionar linhas da tabela de outro usuário; executar o procedimento armazenado de outro usuário. O privilégio de sistema é o direito de realizar uma determinada ação, ou de realizar uma ação em qualquer objeto de esquema de um determinado tipo. Por exemplo, os privilégios de criar espaços de tabelas e de excluir linhas de qualquer tabela em um banco de dados são privilégios de sistema. O privilégio de objeto de esquema é o privilégio, ou direito, de realizar uma determinada ação em um determinado objeto de esquema. Estão disponíveis privilégios de objeto diferentes para objetos de esquema diferentes. Oracle® Database Security Guide 10g Release 1 (10.1) Part Number B10773-01 (N. do T.)

[3]

DB2 — O privilégio transmite o direito para o usuário autorizado, através de seu ID de autorização, de realizar uma determinada ação em um determinado objeto. Permite ao ID de autorização criar, modificar ou acessar determinado recurso do banco de dados. O ID de autorização pode representar um usuário, um grupo ou todos os usuários (PUBLIC). Os privilégios permitem o usuário criar ou acessar recursos do banco de dados. Os privilégios podem ser concedidos para muitos objetos do banco de dados como bancos de dados, esquemas, espaços de tabelas, tabelas, visões, servidores, pacotes e índices. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.)

[4]

DB2Introdução às Autoridades de Banco de Dados — As autoridades fornecem uma maneira de agrupar privilégios e de controlar operações de manutenção e utilitários para instâncias, bancos de dados e objetos de banco de dados. Os usuários podem ter autoridades administrativas que oferecem privilégios completos em um conjunto de objetos de banco de dados ou podem ter autoridades do sistema que oferecem privilégios completos no gerenciamento do sistema, mas não permitem acesso aos dados. SYSADM é o mais alto nível de autoridade administrativa. Ele inclui todos os privilégios em bancos de dados na instância do DB2, além da autoridade para conceder e revogar todas as autoridades e privilégios. O DBADM oferece autoridade administrativa para um banco de dados específico. Ele permite que o usuário acesso e modifique todos os objetos nesse banco de dados. Um usuário com autoridade DBADM pode conceder e revogar privilégios no banco de dados, mas não pode conceder ou revogar a autoridade DBADM. SYSCTRL é a autoridade para controlar os recursos utilizados pelo gerenciador de banco de dados (por exemplo, criação e exclusão de bancos de dados), mas não permite acesso aos dados nos bancos de dados. SYSMAINT é a autoridade para executar operações de manutenção, como iniciar e parar o servidor DB2 e fazer backup e restauração de bancos de dados. Ele não permite acesso aos dados nos bancos de dados. A autoridade LOAD no nível do banco de dados, combinada com o privilégio INSERT na tabela, permite que o usuário carregue dados para essa tabela. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.)

[5]

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

[6]

SQL Serverintercalação (collation) — é um conjunto de regras que determina como os dados são comparados, ordenados e apresentados. Os dados caractere são classificados de acordo com a informação de intercalação, que inclui o idioma, a ordem de classificação e a diferenciação de letras minúsculas e maiúsculas. SQL Server 2005 Books Online — Glossary of Terms (N. do T.)

[7]

collation é uma classificação apropriada para o idioma. Collation (N. do T.)

[8]

collation [informática, computadores] s. intercalação, f. collation | Portuguese | Dictionary & Translation by Babylon (N. do T.)

SourceForge.net Logo CSS válido!