Como posso conceder permissões para objetos recém-criados no Amazon Redshift?
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

Conteúdo relevante
- AWS OFICIALAtualizada há um ano
- AWS OFICIALAtualizada há 5 meses
- AWS OFICIALAtualizada há um ano