HATA: Postgres kullanılarak Cities_id_seq dizisi için izin reddedildi


205

Postgres'de (ve sonuçta veritabanı bilgi sistemlerinde) yeniyim. Ben veritabanımda aşağıdaki sql betiği koştu:

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;

Ne zaman, www kullanıcısı olarak:

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

Aşağıdaki hatayı alıyorum:

ERROR: permission denied for sequence cities_id_seq

Sorun seri tipinde yatıyor. Bu yüzden * _id_seq için www seçme, ekleme ve silme hakları veriyorum. Ancak bu sorunumu çözmez. Neyi kaçırıyorum?


2
Bir sekansa ekleme / silme yapmak benim için bir anlam ifade etmiyor. Hatta çalışmasına şaşırdım.
a_horse_with_no_name

Yanıtlar:


366

PostgreSQL 8.2'den bu yana şunları kullanmalısınız:

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

HİBE KULLANIMI - Diziler için bu ayrıcalık, akım ve sonraki değer işlevlerinin kullanılmasına izin verir.

Ayrıca yorumlarda @ epic_fil tarafından belirtildiği gibi şemadaki tüm dizilere şu izinleri verebilirsiniz:

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

52
FYI, sözdizimi ".. SCHEMA schema_name'deki TÜM DİZİLERDE" de desteklenmektedir.
epic_fil

5
İlginç. Tüm masada benim sırası içinde bir HİBE yaptım, ama bu sırası kapsayacak gibi görünmüyor. Bu aynı zamanda OS tarafından da görünüyor.
Kinnard Hockenhull

44
Bu nasıl gerçek bir şey? Ne zaman bir kullanıcının bir tabloya veri eklemesine izin vermek isterdim, ancak sütunlardan birinin otomatik olarak arttığı gerçeğini kullanmasına izin vermek istemiyorum?
Brett Widmeier

5
IS SELECTgerekli? Olmamalı USAGEgerekenden kapsayacak?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

7
@BrettWidmeier Kesinlikle. Bu tür şeylerin geliştiriciler tarafından nasıl tolere edildiği bana aptalca geliyor. İnsanların internette dolaşmak ve kutudan çıkması gereken şeyleri düzeltmek için dipsiz StackOverflow konularını okumak istemeleri gibi.
milosmns

68

@Phil, fark edilmeyebilecek bir sürü upvotes alan bir yoruma sahip olduğundan, sözdizimini bir şemadaki tüm diziler için bir kullanıcıya izin verecek bir cevap eklemek için kullanıyorum (şemanızın varsayılan 'genel' olduğunu varsayarak) )

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 aynı işlemi gerçekleştirmek için aşağıdakileri yapabilirsiniz: 'GRANT USAGE, SELECT ON' || quote_ident (şema adı) || '' || quote_ident (relname) || 'Www;' FROM pg_statio_all_sequences NEREDE şemaname = 'genel'; - Tom Gerken 2 gün önce
Tom Gerken

39

@Tom_Gerken, @epic_fil ve @kupson, mevcut sekanslarla çalışma izni vermek için ifadeleriyle oldukça doğrudur. Ancak, kullanıcı gelecekte oluşturulacak sekanslara erişim hakları ALMAZ. Bunu yapmak için, GRANT deyimini bir ALTER DEFAULT PRIVILEGES deyimiyle birleştirmelisiniz, şöyle:

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 PostgreSQL 9+ üzerinde çalışıyor.

Bu, mevcut varsayılan ayrıcalıklara eklenecek, bunların üzerine yazılmayacak, bu nedenle oldukça güvenlidir.


-2

Postgres'de aşağıdaki komutu yürütün.

postgres'e giriş:

sudo su postgres;

psql dbname;

SEKANS OLUŞTUR public.cities_id_seq ENCREMENT 1
MINVALUE 0
MAXVALUE 1
START 1 CACHE 1; ALTER TABLE public.cities_id_seq SAHİBİNİN SAHİBİ;

pgowner veritabanı kullanıcınız olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.