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 concedo ao usuário as permissões necessárias para acessar objetos recém-criados no esquema?

Breve descrição

Para que um usuário acesse objetos recém-criados no esquema, os privilégios devem ser concedidos aos objetos por um superusuário.

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

ERROR: permission denied for relation “objectname”.

Esse erro ocorre quando o acesso foi concedido somente aos objetos atuais que estavam presentes em um esquema quando o acesso foi concedido. Por padrão, o acesso não é concedido automaticamente em objetos futuros criados no esquema.

Para resolver esse problema, conceda privilégios de acesso ao usuário usando o comando ALTER DEFAULT PRIVILEGES.

Resolução

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

1.    Para conceder acesso de uso no esquema e 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 acesso SELECT ao usuário para futuras tabelas criadas sob o esquema, execute o seguinte comando: Observação: substitua awsuser pelo nome de usuário usado para criar objetos futuros no esquema, newtestschema com o nome do esquema e newtestuser com o nome de usuário que precisar 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. A execução de ALTER DEFAULT PRIVILEGES não altera os privilégios em objetos existentes.

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

select pg_get_userbyid(d.defacluser) as user, 
n.nspname as schema, 
case d.defaclobjtype when 'r' then 'tables' when 'f' then 'functions' end 
as object_type, 
array_to_string(d.defaclacl, ' + ')  as default_privileges 
from pg_catalog.pg_default_acl d 
left join pg_catalog.pg_namespace n on n.oid = d.defaclnamespace;

Se o acesso estiver presente, você verá uma entrada para o usuário na coluna default_privileges.

Quando o superusuário criar um novo objeto no esquema, o usuário terá acesso SELECT sobre a tabela.

Exemplo

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

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

O superusuário chamado awsuser concede acesso a newtestuser no esquema newtestschema e a todas as tabelas atualmente presentes no esquema usando o seguinte comando de exemplo:

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

O comando anterior concede ao newtestuser acesso SELECT às tabelas atuais presentes no newtestschema. Atualmente, somente a tabela newtesttable1 está presente no newtestschema. A tabela newtesttable1 está acessível para newtestuser.

Em seguida, o awsuser cria outra tabela chamada newtesttable2 no newtestschema. Se newtestuser executar uma consulta SELECT na tabela newtestschema.newtesttable2, ele verá o seguinte erro:

ERROR: permission denied for relation newtesttable2.

Para resolver o erro, o awsuser faz o seguinte:

1.    Concede acesso à tabela newtesttable2 executando o seguinte comando de exemplo:

grant select on table newtestschema.newtesttable2 to newtestuser;

2.    Concede acesso a newtestuser em qualquer tabela futura criada pelo awsuser no newtestschema executando o seguinte comando de exemplo:

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

Quando o awsuser criar outra nova tabela chamada newtesttable3 no newtestschema, o newtestuser terá acesso SELECT a newtesttable3.

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

select pg_get_userbyid(d.defacluser) as user, 
n.nspname as schema, 
case d.defaclobjtype when 'r' then 'tables' when 'f' then 'functions' end 
as object_type, 
array_to_string(d.defaclacl, ' + ')  as default_privileges 
from pg_catalog.pg_default_acl d 
left join pg_catalog.pg_namespace n on n.oid = d.defaclnamespace;

O resultado da consulta anterior é semelhante ao seguinte:

user    | schema    | object_type    | default_privileges
awsuser | newtestschema    | tables    | newtestuser=r/awsuser

O resultado mostra que o awsuser concede privilégios SELECT ao newtestuser para todas as novas tabelas criadas pelo awsuser no newtestschema.


Informações relacionadas

PG_DEFAULT_ACL

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos