GALAT: izin ditolak untuk urutan cities_id_seq menggunakan Postgres


202

Saya baru di postgres (dan pada sistem info basis data semuanya). Saya menjalankan skrip sql berikut di basis data saya:

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;

Ketika, sebagai pengguna www, mencoba untuk:

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

Saya mendapatkan kesalahan berikut:

ERROR: permission denied for sequence cities_id_seq

Saya mendapatkan bahwa masalahnya terletak pada tipe serial. Itu sebabnya saya memberikan hak pilih, masukkan dan hapus untuk * _id_seq ke www. Namun ini tidak memperbaiki masalah saya. Apa yang saya lewatkan?


2
Memberi insert / delete secara berurutan tidak masuk akal bagi saya. Saya terkejut bahwa itu bahkan berhasil.
a_horse_with_no_name

Jawaban:


360

Karena PostgreSQL 8.2 Anda harus menggunakan:

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

PENGGUNAAN GRANT - Untuk urutan, hak istimewa ini memungkinkan penggunaan fungsi currval dan nextval.

Juga seperti yang ditunjukkan oleh @epic_fil dalam komentar Anda dapat memberikan izin ke semua urutan dalam skema dengan:

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

52
FYI, sintaksis ".. PADA SEMUA URUTAN DALAM SCHEMA schema_name" juga didukung.
epic_fil

5
Menarik. Saya melakukan GRANT semua di atas meja urutan saya, tapi ini tampaknya tidak mencakup urutan. Ini juga tampaknya sangat oleh OS.
Kinnard Hockenhull

41
Bagaimana ini nyata? Kapan saya ingin mengizinkan pengguna untuk memasukkan data ke dalam tabel tetapi TIDAK ingin mereka menggunakan fakta bahwa salah satu kolom bertambah secara otomatis?
Brett Widmeier

5
Apakah SELECTperlu? Bukankah seharusnya USAGEmenutupi apa yang dibutuhkan?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

6
@ BrettWidmeier Persis. Sangat mengejutkan bagi saya bagaimana hal semacam ini ditoleransi oleh para pengembang. Ini seperti orang ingin berkeliaran di Internet dan membaca utas StackOverflow tanpa dasar dalam upaya untuk memperbaiki hal-hal yang seharusnya sudah bekerja dengan baik.
milosmns

67

Karena @Phil memiliki komentar yang mendapatkan banyak upvotes yang mungkin tidak diperhatikan, saya menggunakan sintaksnya untuk menambahkan jawaban yang akan memberikan izin kepada pengguna untuk semua urutan dalam suatu skema (dengan asumsi skema Anda adalah 'publik' default. )

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

2
Perhatikan bahwa ini hanya bekerja di PostgreSQL 9.0 dan lebih tinggi, untuk mencapai hal yang sama di 8 Anda dapat melakukan sesuatu seperti: SELECT 'GRANT USAGE, SELECT ON' || quote_ident (schemaname) || '.' || quote_ident (relname) || 'KE www;' DARI pg_statio_all_afterences WHERE schemaname = 'publik'; - Tom Gerken 2 hari lalu
Tom Gerken

39

@ Tom_Gerken, @epic_fil dan @kupson cukup benar dengan pernyataan mereka untuk memberikan izin untuk bekerja dengan urutan yang ada. Namun, pengguna TIDAK akan mendapatkan hak akses ke urutan yang dibuat di masa depan. Untuk melakukan itu, Anda harus menggabungkan pernyataan GRANT dengan pernyataan ALTER DEFAULT PRIVILEGES, seperti:

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

Ini hanya berfungsi pada PostgreSQL 9+, tentu saja.

Ini akan ditambahkan ke hak default yang ada, tidak menimpa mereka, jadi cukup aman dalam hal itu.


-2

Jalankan perintah berikut di postgres.

masuk ke postgres:

sudo su postgres;

psql dbname;

CREATE SEQUENCE public.cities_id_seq INCREMENT 1
MINVALUE 0
MAXVALUE 1
MULAI 1 CACHE 1; ALTER TABLE public.cities_id_seq PEMILIK KE pgowner;

pgowner akan menjadi pengguna basis data Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.