Permissão negada para a relação <table>

12

Eu executei o seguinte SQL no psql:

CREATE USER bspu LOGIN;

CREATE DATABASE bsp OWNER bspu;

GRANT ALL PRIVILEGES ON DATABASE bsp TO bspu;

\c bsp

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  client_id VARCHAR(20) NOT NULL,
  api_key VARCHAR(100) NOT NULL,
  api_secret VARCHAR(100) NOT NULL,
  auth_token VARCHAR(128) NOT NULL
);

Quando eu logo como bspue tento consultar a userstabela, recebo o erro:

permission denied for relation users

Eu tentei correr:

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;

Mas isso não ajuda. O que estou fazendo errado? Por que o proprietário do banco de dados NÃO tem permissão para consultar seu próprio banco de dados?

EDIT: atualizei bspupara superusuário por enquanto, para poder continuar trabalhando. Qualquer orientação adicional apreciada.

se __name__ for Nenhum
fonte
O que \dt "users"mostra a saída do show?
BMA
@ bma apenas meu acc principal está listado.
se __name__ é None
Você executou os comandos iniciais como qual usuário? O que você obtém SELECT session_user, current_userna parte superior do seu script? E qual é a sua versão do Postgres?
Erwin Brandstetter
Se esses foram os comandos exatos que você executou, ainda estará conectado ao seu 'acesso principal'. Então se resume a quais privilégios você tem. Caso contrário, veja a excelente resposta de Erwin. (Deixe-me admitir que considero idiota que essa mensagem de erro não diga qual função não tem permissão. Por exemplo, quando alguém executa uma cadeia de funções com o SECURITY DEFINER, fica muito rápido confundindo quem é quem.)
dezso

Respostas:

22

DEFAULT PRIVILEGESse não alterar as permissões para existentes objetos. Eles são os privilégios padrão para objetos recém-criados e apenas para a função específica à qual pertencem. Se você não definir a função ao executar ALTER DEFAULT PRIVILEGES, o padrão será a função atual (ao executar a ALTER DEFAULT PRIVILEGESinstrução

Além disso, como você está usando uma serialcoluna, que cria a SEQUENCE, também será necessário definir privilégios padrão para sequências.

Execute isso no usuário com o qual você cria objetos, antes de executar o CREATEcomando:

ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON TABLES TO bspu;
ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON SEQUENCES TO bspu;

Se você deve usar o pgAdmin, uma palavra de cautela. Há um erro na versão atual 1.20 (ou mais antiga) na exibição do script SQL de engenharia reversa para DEFAULT PRIVILEGES. O visor ignora o usuário proprietário e, portanto, está incorreto em determinadas situações. Eu relatei o bug, o assunto está pendente .

Para objetos existentes , você também pode estar interessado neste formulário "em lote" do GRANTcomando :

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO bspu;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO bspu;

Mais nesta questão relacionada ao SO:

Erwin Brandstetter
fonte
11
O bug mencionado ainda persiste no pgAdmin4, consulte redmine.postgresql.org/issues/4685 , que foi sinalizado como uma duplicata do redmine.postgresql.org/issues/4256
dpprdan
-1
This is working for me after some research. psql (9.6.12)

-- login to postgres database server as postgres user.
ssh <user>>@hostname.<domain>>.com
sudo su postgres
id
psql
postgres=# create user sentry_read with login password 'sentry_read';
postgres=# du+
postgres=# \l+
-- **very important: make sure we should connect required database before we grant to user.**
postgres=# \c sentry
postgres=# \dt
sentry=# \dp SENTRY_VERSION
sentry=# select * from "SENTRY_VERSION";
sentry=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO sentry_read;
postgres=# \q

[user@hostname ~]$ psql -U sentry_read -d sentry -h hostname.<domain>>.com -W
sentry=> select * from "SENTRY_VERSION";
Srinu Mareti
fonte