Ir para o conteúdo

Como posso conceder permissões para objetos recém-criados no Amazon Redshift?

4 minuto de leitura
0

Meu usuário recebeu um erro de permissão negada para um objeto recém-criado. Como faço para conceder ao usuário as permissões necessárias para acessar objetos recém-criados no esquema?

Breve descrição

Os usuários que desejam acessar objetos recém-criados no esquema devem ter privilégios de acesso concedidos pelo proprietário do objeto ou por um superusuário.

Quando um usuário não consegue acessar objetos recém-criados no esquema, ele pode receber o seguinte erro:

“ERRO: permissão negada para a relação 'nome do objeto'”

Esse erro ocorre quando o acesso é concedido somente para os objetos presentes em um esquema quando o acesso foi concedido pela primeira vez. Por padrão, o acesso não é concedido automaticamente para objetos criados no esquema atual.

Para resolver esse problema, conceda privilégios de acesso ao usuário ou por meio de funções de grupo. Use o comando ALTER DEFAULT PRIVILEGES.

Resolução

Para conceder permissões para as tabelas atuais e futuras no esquema, faça o seguinte como superusuário:

  1. para conceder acesso de uso no esquema e o acesso SELECT em todas as tabelas atualmente presentes no esquema, execute os seguintes comandos:
    Observação: substitua newtestschema pelo nome do seu esquema e newtestuser pelo nome do usuário.

    grant usage on schema newtestschema to newtestuser;
    grant select on all tables in schema newtestschema to newtestuser;
  2. Para conceder o acesso SELECT ao usuário para tabelas futuras criadas sob o esquema, execute o seguinte comando:
    Observação: substitua awsuser pelo nome de usuário que será usado para criar objetos futuros no esquema. Em seguida, substitua newtestschema pelo nome do esquema e newtestuser pelo nome de usuário que precisa acessar objetos futuros.

    alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;

    Observação: os privilégios padrão se aplicam somente a novos objetos. Quando você executa o comando ALTER DEFAULT PRIVILEGES os privilégios nos objetos existentes não são alterados.

  3. Para verificar se os privilégios padrão foram concedidos ao usuário, execute a seguinte consulta como superusuário:

    select * from svv_default_privileges where grantee_name = 'newtestuser';
    select * from svv_default_privileges where schema_name = 'newtestschema';
    select * from svv_default_privileges where grantee_type = 'role';

    Para revisar as permissões concedidas diretamente ao usuário, execute a seguinte consulta como superusuário:

    SELECT * FROM svv_relation_privileges where identity_name = 'newtestuser';

Exemplo de resolução

O exemplo a seguir começa com essa configuração:

  • Um usuário chamado newtestuser que não é superusuário.
  • Um esquema chamado newtestschema e uma tabela chamada newtesttable1 sob o esquema com alguns registros.

Um superusuário chamado awsuser concede acesso a newtestuser no esquema newtestschema e em todas as tabelas atualmente presentes no esquema. Para conceder acesso, o awsuser usa o seguinte comando de exemplo:

grant usage on schema newtestschema to newtestuser;
grant select on all tables in schema newtestschema to newtestuser;

O comando concede ao newtestuser com o acesso SELECT às tabelas atualmente presentes no newtestschema. Atualmente, somente a tabela newtesttable1 está presente no newtestschema. Como resultado, a tabela newtesttable1 pode ser acessada por newtestuser.

Em seguida, awsuser cria outra tabela chamada newtesttable2 sob o newtestschema. Se newtestuser executar uma consulta SELECT na tabela newtestschema.newtesttable2, o erro a seguir será exibido:

ERROR: permission denied for relation newtesttable2.

Para resolver o erro, o awsuser executa as seguintes etapas:

  1. Concede acesso à tabela newtesttable2. Para fazer isso, awsuser executa o seguinte comando de exemplo:

    grant select on table newtestschema.newtesttable2 to newtestuser;
  2. Concede acesso a newtestuser para quaisquer tabelas futuras criadas pelo awsuser sob o newtestschema. Para fazer isso, awsuser executa o seguinte comando de exemplo:

    alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;

    Agora, quando awsuser cria outra nova tabela chamada newtesttable3 no newtestschema, newtestuser terá acesso SELECT à tabela newtesttable3.

  3. Para verificar se os privilégios padrão foram concedidos a newtestuser, awsuser executa a seguinte consulta:

    select * from svv_default_privileges where grantee_name = 'newtestuser';
    select * from svv_default_privileges where schema_name = 'newtestschema';
    select * from svv_default_privileges where grantee_type = 'role';

    Para revisar as permissões concedidas diretamente ao newtestuser, awsuser executa a seguinte consulta:

    SELECT * from svv_relation_privileges where identity_name = 'newtestuser';

    A saída mostra que awsuser concede privilégios SELECT a newtestuser para todas as novas tabelas criadas por awsuser no newtestschema.

    schema_name | object_type | owner_id | owner_name | owner_type | privilege_type | grantee_id | grantee_name | grantee_type | admin_option
    newtestschema | RELATION | 100 | awsuser | user | SELECT | 101 | newtestuser | user | FALSE

Informações relacionadas

PG_DEFAULT_ACL

AWS OFICIALAtualizada há um ano