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.