2012-02-17 19 views
103

kullanarak cities_id_seq dizisi için izin reddedildi Postgre'de (ve veritabanı bilgi sistemlerinde) tamamen yeniyim.HATA: izin 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; 

kullanıcı www, çalışmak gibi zaman:

aşağıdaki hatayı
insert into cities (name) values ('London'); 

Ben olsun: Ben

ERROR: permission denied for sequence cities_id_seq 

olsun benim veritabanında sql komut aşağıdaki ran Sorun seri tipinde yatıyor. Bu yüzden, * _id_seq için www için seçme, ekleme ve silme haklarım var. Yine de bu benim sorunumu düzeltmez. Neyi kaçırıyorum? diziler için bu ayrıcalık currval ve nextval işlevlerin kullanılmasına olanak -

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www; 

VERME KULLANIMI:

+1

Sırayla ekleme/silme işlemi bana mantıklı gelmiyor. İşe bile şaşırmıştım. –

cevap

183

PostgreSQL 8.2 yana kullanmak zorunda. Birlikte şemada tüm dizileri izinleri verebilir yorumlarda @epic_fil tarafından işaret olarak da

:

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

Teşekkürler. Bu çalıştı. Sadece bu iki tabloya hak verdiğim yolun norm olup olmadığını veya bir yerde daha kabul gören bir standart olup olmadığını merak ediyorum. Sadece satır ekleyebilmek, düzenleyebilmek ve çıkarabilmek için www'e ihtiyacım var. – Vampnik

+0

@Vampnik: Bu durumda tüm tablolara UPDATE eklemeniz gerekiyor. Diziler için "KULLANIM, SEÇ" yeterli olmalıdır. –

+0

@ A.H. Sonuncusu için teşekkür ederim. Sadece kendimi de keşfettim. – Vampnik

53

@Phil fark almayabilir upvotes bir sürü elde bir yorum olduğundan Ben bir şemada tüm diziler için bir kullanıcıya izin vermek olacaktır bir cevap eklemek için onun sözdizimi kullanıyorum

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

Bunun sadece PostgreSQL 9.0 ve üstü sürümlerde çalıştığını unutmayın, 8'de de aynısını yapmak için şunları yapabilirsiniz: SELECT 'GRANT USAGE, SELECT ON' || quote_ident (schemaname) || '' || quote_ident (relname) || 'TO www;' FROM pg_statio_all_sequences WHERE schemaname = 'public'; - Tom Gerken 2 gün önce –

21

@Tom_Gerken, @epic_fil ve @kupson (şema varsayarak 'kamu' varsayılan) exi ile çalışmak için izin vermek için ifadeleri ile oldukça doğru sokma dizileri. Ancak, kullanıcı gelecekte oluşturulacak sekanslara erişim haklarını ALMAYACAKTIR. Bunu yapmak için, şöyle bir ALTER varsayılan ayrıcalıkları ifadeye GRANT deyimi birleştirmek için vardır: PostgreSQL 9 + üzerinde

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

Bu sadece, tabii ki.

Bu, varolan varsayılan ayrıcalıklara eklenir, bunların üzerine yazılmaz, bu nedenle bu konuda oldukça güvenlidir.