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:
-
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;
-
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.
-
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:
-
Concede acesso à tabela newtesttable2. Para fazer isso, awsuser executa o seguinte comando de exemplo:
grant select on table newtestschema.newtesttable2 to newtestuser;
-
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.
-
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