terça-feira, 25 de outubro de 2011

Oracle - Grant

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_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 ([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 ]

 

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 ]

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, esquema ou espaço de tabelas) para um ou mais usuários ou grupos de usuários. Estes privilégios são adicionados aos já concedidos, se existirem. [1] [2] [3] [4]

A palavra chave PUBLIC indica que os privilégios devem 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 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. Atualmente as opções de concessão somente podem ser concedidas a usuários individuais, e não a grupos ou 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 comandoREVOKE 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. O comando SELECT ... FOR UPDATE também requer este privilégio (além do privilégioSELECT). 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.

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

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.

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

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

                  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 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;

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

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.

O privilégio RULE, e os privilégios para bancos de dados, espaços de tabelas, esquemas, linguagens e seqüências são extensões do PostgreSQL.

Fonte: http://pgdocptbr.sourceforge.net/pg80/sql-grant.html

Nenhum comentário :

Postar um comentário

Related Posts Plugin for WordPress, Blogger...