Na documentação do postgresql na opção GRANT está escrito:
Não há necessidade de conceder privilégios ao proprietário de um objeto (geralmente o usuário que o criou), pois o proprietário possui todos os privilégios por padrão. (O proprietário pode, no entanto, optar por revogar alguns dos seus próprios privilégios por segurança.)
Agora tenho uma tabela de banco de dados com um usuário proprietário, mas recebo ERROR: permission denied for table alert
sempre que tento selecionar nesta tabela:
database=# SET ROLE user;
SET
database=> select * from pg_tables where tablename = 'alert';
schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity
------------+-----------+--------------------+------------+------------+----------+-------------+-------------
public | alert | user | | t | f | f | f
(1 строка)
database=> select * from alert limit 1;
ERROR: permission denied for table alert
Por que é isso?
Não há privilégios de tabela adicionais:
database=> \z Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+------------------------------------+----------+-------------------+-------------------+----------
public | alert | table | | |
Além disso, o esquema e o proprietário do banco de dados foram alterados para usuário.
Para solucionar esse problema, preciso GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO user;
e tudo funciona bem.
Então, reiterando a pergunta: como é possível que o proprietário não consiga selecionar na mesa? Sim, eu executei REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM user;
, mas espero que isso redefina os privilégios para os valores padrão e, provavelmente, esta minha suposição está errada. Mas então, como posso descobrir que minhas permissões não são mais padrão? Se eu olhar para \z
a saída, tudo parecerá como era antes GRANT
/ REVOKE
. Além disso, olhando para outros bancos de dados, onde não tenho problemas com o select, não vejo nenhuma diferença na saída do \z
. Depois de pesquisar muito no Google, descobri que \l
a saída (e suponho \z
) não é exibida para valores padrão . Mas então como posso encontrar esses padrões? \ddp
a saída está vazia e estou perdido aqui :(
Agradecemos antecipadamente por qualquer ajuda.