ERRO: permissão negada para a sequência cities_id_seq usando o Postgres

202

Eu sou novo no postgres (e nos sistemas de informações do banco de dados). Eu executei o seguinte script sql no meu banco de dados:

create table cities (
id serial primary key,
name text not null
);

create table reports (
id serial primary key,
cityid integer not null references cities(id),
reportdate date not null,
reporttext text not null
);

create user www with password 'www';

grant select on cities to www;
grant insert on cities to www;
grant delete on cities to www;

grant select on reports to www;
grant insert on reports to www;
grant delete on reports to www;

grant select on cities_id_seq to www;
grant insert on cities_id_seq to www;
grant delete on cities_id_seq to www;

grant select on reports_id_seq to www;
grant insert on reports_id_seq to www;
grant delete on reports_id_seq to www;

Quando, como o usuário www, tentando:

insert into cities (name) values ('London');

Estou tendo o erro a seguir:

ERROR: permission denied for sequence cities_id_seq

Eu entendo que o problema está no tipo de série. É por isso que concedo direitos de seleção, inserção e exclusão do * _id_seq para www. No entanto, isso não resolve o meu problema. o que estou perdendo?

Vampnik
fonte
2
Conceder inserção / exclusão em uma sequência não faz sentido para mim. Estou surpreso que isso funcione.
A_horse_with_no_name

Respostas:

360

Desde o PostgreSQL 8.2, você precisa usar:

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

UTILIZAÇÃO DE CONCESSÃO - Para seqüências, esse privilégio permite o uso das funções currval e nextval.

Também como apontado por @epic_fil nos comentários, você pode conceder permissões para todas as sequências no esquema com:

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO www;
Kupson
fonte
52
Para sua informação, a sintaxe "... EM TODAS AS SEQUÊNCIAS DO ESQUEMA schema_name" também é suportada.
Epic_fil 12/02
5
Interessante. Eu fiz um GRANT na mesa em que minha sequência está, mas isso não parece cobrir a sequência. Isso também parece muito pelo sistema operacional.
Kinnard Hockenhull
41
Como isso é uma coisa real? Quando é que eu gostaria de permitir que um usuário insira dados em uma tabela, mas NÃO quero que ele use o fato de que uma das colunas é incrementada automaticamente?
Brett Widmeier
5
É SELECTnecessário? Não deve USAGEcobrir o que é necessário?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ
6
@BrettWidmeier Exatamente. É impressionante para mim como esse tipo de coisa é tolerado pelos desenvolvedores. É como se as pessoas quisessem percorrer a Internet e ler threads StackOverflow sem fundo na tentativa de consertar coisas que deveriam estar funcionando imediatamente.
milosmns
67

Como o @Phil tem um comentário recebendo muitas votações que podem não ser notadas, eu estou usando sua sintaxe para adicionar uma resposta que concederá permissões a um usuário para todas as sequências em um esquema (assumindo que o esquema é o padrão 'público' )

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public to www;
Tom Gerken
fonte
2
Observe que isso só funciona no PostgreSQL 9.0 e posterior; para realizar o mesmo no 8, você pode fazer algo como: SELECT 'GRANT USAGE, SELECT ON' || quote_ident (schemaname) || '.' || quote_ident (relname) || 'PARA www;' FROM pg_statio_all_sequences WHERE schemaname = 'public'; - Tom Gerken há 2 dias
Tom Gerken
39

@Tom_Gerken, @epic_fil e @kupson estão bem corretos com suas instruções para conceder permissões para trabalhar com seqüências existentes. No entanto, o usuário NÃO obterá direitos de acesso a sequências criadas no futuro. Para fazer isso, você deve combinar a instrução GRANT com uma instrução ALTER DEFAULT PRIVILEGES, da seguinte maneira:

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO www;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT USAGE, SELECT ON SEQUENCES TO www;

Isso funciona apenas no PostgreSQL 9+, é claro.

Isso será anexado aos privilégios padrão existentes, não os substituirá, portanto é bastante seguro nesse sentido.

Asfand Qazi
fonte
-2

Execute o seguinte comando no postgres.

faça o login no postgres:

sudo su postgres;

psql dbname;

CRIAR SEQUÊNCIA public.cities_id_seq INCREMENTO 1
MINVALUE 0
MAXVALUE 1
INÍCIO 1 CACHE 1; ALTER TABLE public.cities_id_seq PROPRIETÁRIO DO pgowner;

O pgowner será o seu usuário do banco de dados.

Shreeram
fonte