Permissão negada por relação


330

Eu tentei executar o comando sql simples:

select * from site_adzone;

e eu recebi esse erro

ERROR:  permission denied for relation site_adzone

Qual poderia ser o problema aqui?

Tentei também selecionar para outras tabelas e obtive o mesmo problema. Eu também tentei fazer isso:

GRANT ALL PRIVILEGES ON DATABASE jerry to tom;

mas eu recebi essa resposta do console

WARNING:  no privileges were granted for "jerry"

Você tem alguma idéia do que pode estar errado?


Não estou certo de como atualizar as permissões para que eu possa ler / escrever no DB
Boban


2
Bem-vindo ao SO! Para esta pergunta, você pode obter mais ajuda sobre a dba.stackexchange.com, embora você pode encontrar apenas como muitos comentários sarcásticos :)
Jared Beck

10
Desculpe. Esta é a segunda pergunta do postgresql muito relacionada à programação que eu vi fechada hoje à noite! O último teve 67.000 visualizações, este 30.000 visualizações. Deveríamos ter uma cláusula de popularidade: qualquer pergunta não subjetiva com> 15.000 visualizações = no tópico.
Theodore R. Smith

1
Esta questão não está fora de tópico! No entanto, é uma duplicação de stackoverflow.com/questions/13497352/…
wheaties

Respostas:


391

GRANT no banco de dados não é o que você precisa. Conceda diretamente nas mesas.

A concessão de privilégios no banco de dados é usada principalmente para conceder ou revogar privilégios de conexão. Isso permite que você especifique quem pode fazer coisas no banco de dados se eles tiverem outras permissões suficientes.

Você deseja:

 GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry;

Isso resolverá esse problema.


7
execute-o como um superusuário, como o postgres.
precisa

19
Isso pode ser um atalho de alguma forma? CONCEDE TODOS OS PRIVILÉGIOS EM TODAS AS MESAS?
Shadur

196
@Shadur CONCEDE TODOS OS PRIVILÉGIOS EM TODAS AS MESAS NO ESQUEMA público a jerry;
Ron E

10
@ RonE isso é restrito ao banco de dados atual?
Shadur

7
@zmiftah para o esquema que você precisa> CONCEDE TODOS OS PRIVILEGIOS NO ESQUEMA nameSchema TO user;
Pierozi 4/15

241

Postar Ron E responder por privilégios concedidos em todas as tabelas, pois pode ser útil para outras pessoas.

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;

21
Você também pode precisar executar um comando semelhante para ALL SEQUENCESe ALL FUNCTIONS.
Pistos

7
Apenas para aqueles que estavam perguntando: ALL TABLEStambém inclui pontos de vista, por isso não há separado ALL VIEWScomando :-)
André Gasser

74

Conecte-se ao banco de dados correto primeiro e execute:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;

4
graças a conexão com o banco de dados correto NÃO estava fazendo antes!
ASGs

15
Conecte-se ao banco de dados certo faz uma dufference enorme :)\connect databasename;
Denis Matafonov

3
ISTO. Eu estava conectado ao "postgres" o tempo todo. Obrigado!
Andrew G.

2
Sim conectar ao DB fez a diferença
inostia

44
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public to jerry;

essa resposta salvou meu dia!
anhtran

19

O primeiro e importante passo é conectar-se ao seu banco de dados:

psql -d yourDBName

2 passo, conceder privilégios

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO userName;

18

Para conceder permissões a todas as tabelas existentes no esquema, use:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema> TO <role>

Para especificar permissões padrão que serão aplicadas a tabelas futuras, use:

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> 
  GRANT <privileges> ON TABLES TO <role>;

por exemplo

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO admin;

Se você usar SERIALou BIGSERIALcolunas, provavelmente desejará fazer o mesmo SEQUENCES, caso contrário o seu INSERTfalhará (o Postgres 10IDENTITY não sofre com esse problema e é recomendado sobre os SERIALtipos), ou seja,

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> GRANT ALL ON SEQUENCES TO <role>;

Consulte também minha resposta para as permissões do PostgreSQL para Web App para obter mais detalhes e um script reutilizável.

Ref:

CONCEDER

ALTERAR PRIVILÉGIOS PADRÕES


9

Isso acontece frequentemente quando você cria uma tabela como usuário postgres e tenta acessá-la como um usuário comum. Nesse caso, é melhor efetuar login como usuário do postgres e alterar a propriedade da tabela com o comando:

alter table <TABLE> owner to <USER>;

5

Certifique-se de fazer login no psql como o proprietário das tabelas. para descobrir quem é o dono das tabelas\dt

psql -h CONNECTION_STRING DBNAME -U OWNER_OF_THE_TABLES

então você pode executar os GRANTS


0

Como você está procurando por permissões de seleção, sugiro que você conceda apenas privilégios de seleção e não todos. Você pode fazer isso:

GRANT SELECT ON <table> TO <role>;

0

Você deve:

  1. conecte-se ao banco de dados por meio do DBeaver com o usuário do postgres
  2. na guia esquerda, abra seu banco de dados
  3. abra a guia / menu suspenso Funções
  4. selecione seu usuário
  5. na guia direita, pressione 'guia Permissões'
  6. pressione sua guia de esquema
  7. pressione a guia / lista suspensa
  8. selecione todas as tabelas
  9. marque todas as caixas de seleção de permissões necessárias (ou pressione Conceder tudo)
  10. pressione Salvar

-3

Fui confrontado com este problema uma vez. basta alterar o usuário do banco de dados para um superusuário e seu problema será resolvido.

ALTER USUÁRIO myuser WITH SUPERUSER;


Ao fazer isso, você concede mais premissas do que precisa. Superusuário irá dar-lhes permissão para outras operações que você pode não querer que o usuário a fazer, como a criação de outros usuários, bancos de dados, etc.
Santi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.