2012-02-17 37 views
103

Soy nuevo en postgres (y en todos los sistemas de información de bases de datos). Corrí siguiente secuencia de comandos SQL en mi base de datos:ERROR: permiso denegado para la secuencia cities_id_seq usando Postgres

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 el usuario www, tratando de:

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

me sale el siguiente error:

ERROR: permission denied for sequence cities_id_seq 

me sale 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?

+1

Otorgar insertar/borrar en una secuencia no tiene sentido para mí. Me sorprende que incluso funcione. –

Respuesta

183

Desde PostgreSQL 8.2 que tienen que utilizar:

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www; 

GRANT USO - Para secuencias, este privilegio permite el uso de las funciones CURRVAL y NEXTVAL.

también como señala @epic_fil en los comentarios se puede conceder permisos a todas las secuencias en el esquema con:

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

Gracias. Este funcionó. Me pregunto si la forma en que estoy otorgando derechos a estas dos mesas es la norma o si hay un estándar más aceptado en alguna parte. Solo necesito que www pueda agregar, editar y eliminar filas. – Vampnik

+0

@Vampnik: en ese caso, debe agregar ACTUALIZACIÓN a todas las tablas. Para las secuencias, el 'USO, SELECCIONAR' debería ser suficiente. –

+0

@ A.H. Gracias por la ultima. Acabo de descubrir este último yo también. – Vampnik

53

Desde @Phil tiene un comentario recibiendo una gran cantidad de upvotes que podría no llamar la atención , estoy usando la sintaxis para añadir una respuesta que va a conceder permisos a un usuario para todas las secuencias en un esquema (asumiendo que su esquema es el valor por defecto 'público')

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

Tenga en cuenta que esto solo funciona en PostgreSQL 9.0 y posteriores, para lograr lo mismo en 8 podría hacer algo como: SELECCIONAR 'USO DE SUBVENCIONES, SELECCIONAR ENCENDIDO' || quote_ident (schemaname) || ''. || quote_ident (relname) || 'A www;' FROM pg_statio_all_sequences WHERE schemaname = 'public'; - Tom Gerken hace 2 días –

21

@Tom_Gerken, @epic_fil y @kupson son bastante correctos con sus declaraciones para dar permisos para trabajar con exi secuencias de picadura. Sin embargo, el usuario NO tendrá derechos de acceso a las secuencias creadas en el futuro. Para hacer eso, usted tiene que combinar la sentencia GRANT con una instrucción ALTER privilegios por defecto, así:

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 sólo 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.