ERROR: permiso denegado para la secuencia cities_id_seq usando Postgres


202

Soy nuevo en postgres (y en todos los sistemas de información de la base de datos). Ejecuté el siguiente script sql en mi base de datos:

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;

Cuando, como usuario www, intenta:

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

Obtuve el siguiente error:

ERROR: permission denied for sequence cities_id_seq

Entiendo que el problema radica en el tipo de serie. Es por eso que otorgo derechos de selección, inserción y eliminación para * _id_seq a www. Sin embargo, esto no soluciona mi problema. ¿Qué me estoy perdiendo?


2
Otorgar inserción / eliminación en una secuencia no tiene sentido para mí. Me sorprende que incluso funcione.
a_horse_with_no_name

Respuestas:


360

Desde PostgreSQL 8.2 tienes que usar:

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

USO DE LA CONCESIÓN: para secuencias, este privilegio permite el uso de las funciones currval y nextval.

Además, como lo señala @epic_fil en los comentarios, puede otorgar permisos a todas las secuencias del esquema con:

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

52
FYI, la sintaxis "... EN TODAS LAS SECUENCIAS EN EL ESQUEMA nombre_esquema" también es compatible.
epic_fil

55
Interesante. Hice una CONCESIÓN en la tabla en la que está mi secuencia, pero esto no parece cubrir la secuencia. Esto también parece muy por OS.
Kinnard Hockenhull

42
¿Cómo es esto una cosa real? ¿Cuándo querría permitir que un usuario inserte datos en una tabla pero NO quisiera permitirles usar el hecho de que una de las columnas se incrementa automáticamente?
Brett Widmeier

55
Es SELECTnecesario? ¿No debería USAGEcubrir lo que se necesita?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

77
@BrettWidmeier Exactamente. Es asombroso para mí cómo los desarrolladores toleran este tipo de cosas. Es como si la gente quisiera deambular por Internet y leer subprocesos StackOverflow sin fondo en un intento por arreglar cosas que deberían haber estado funcionando de manera inmediata.
milosmns

67

Como @Phil tiene un comentario que recibe muchas votaciones positivas que podrían no ser notadas, estoy usando su sintaxis para agregar una respuesta que otorgará permisos a un usuario para todas las secuencias en un esquema (suponiendo que su esquema sea el "público" predeterminado )

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public to www;

2
Tenga en cuenta que esto solo funciona en PostgreSQL 9.0 y versiones posteriores, para lograr lo mismo en 8 podría hacer algo como: SELECCIONE 'USO DE LA SUBVENCIÓN, SELECCIONE EN' || cita_identificador (esquema) || '.' || cita_ident (relname) || 'A www;' DE pg_statio_all_sequences WHERE schemaname = 'public'; - Tom Gerken hace 2 días
Tom Gerken

39

@Tom_Gerken, @epic_fil y @kupson son bastante correctos con sus declaraciones para dar permisos para trabajar con secuencias existentes. Sin embargo, el usuario NO obtendrá derechos de acceso a secuencias creadas en el futuro. Para hacer eso, debe combinar la declaración GRANT con una declaración ALTER DEFAULT PRIVILEGES, de esta manera:

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

Esto solo funciona en PostgreSQL 9+, por supuesto.

Esto se agregará a los privilegios predeterminados existentes, no los sobrescribirá, por lo que es bastante seguro en ese sentido.


-2

Ejecute el siguiente comando en postgres.

iniciar sesión en postgres:

sudo su postgres;

psql dbname;

CREAR SECUENCIA public.cities_id_seq INCREMENTO 1
MINVALUE 0
MAXVALUE 1
START 1 CACHE 1; ALTER TABLE public.cities_id_seq PROPIETARIO DE pgowner;

pgowner será su usuario de la base de datos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.