ข้อผิดพลาด: สิทธิ์ที่ถูกปฏิเสธสำหรับลำดับ Cities_id_seq โดยใช้ Postgres


201

ฉันใหม่ที่ postgres (และที่ระบบข้อมูลฐานข้อมูลทั้งหมด) ฉันรันสคริปต์ sql ในฐานข้อมูลของฉัน:

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;

เมื่อในฐานะผู้ใช้ www พยายาม:

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

ฉันได้รับข้อผิดพลาดต่อไปนี้:

ERROR: permission denied for sequence cities_id_seq

ฉันเข้าใจว่าปัญหาอยู่ที่ประเภทอนุกรม นั่นเป็นเหตุผลที่ฉันให้สิทธิ์เลือกแทรกและลบสิทธิ์สำหรับ * _id_seq ถึง www แต่นี่ไม่ได้ช่วยแก้ปัญหาของฉัน ฉันกำลังคิดถึงอะไร


2
การให้สิทธิ์แทรก / ลบในลำดับไม่สมเหตุสมผลสำหรับฉัน ฉันประหลาดใจที่มันใช้งานได้
a_horse_with_no_name

คำตอบ:


359

ตั้งแต่ PostgreSQL 8.2 คุณต้องใช้:

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

การใช้สิทธิ์ - สำหรับลำดับสิทธิ์พิเศษนี้อนุญาตให้ใช้ฟังก์ชัน currval และ nextval

เช่นเดียวกับที่ชี้ให้เห็นโดย @epic_fil ในความคิดเห็นที่คุณสามารถให้สิทธิ์กับลำดับทั้งหมดในสคีมาด้วย:

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

52
FYI, ไวยากรณ์ "... ทุกรายการใน SCHEMA schema_name" ได้รับการสนับสนุน
epic_fil

5
น่าสนใจ ฉันทำ GRANT ทั้งหมดบนโต๊ะที่ลำดับของฉันอยู่ แต่ดูเหมือนจะไม่ครอบคลุมลำดับ นี่ก็ดูเหมือนจะเป็นอย่างมากโดยระบบปฏิบัติการ
Kinnard Hockenhull

41
สิ่งนี้เป็นเรื่องจริงได้อย่างไร เมื่อใดที่ฉันจะต้องการอนุญาตให้ผู้ใช้แทรกข้อมูลลงในตาราง แต่ไม่ต้องการอนุญาตให้พวกเขาใช้ความจริงที่ว่าหนึ่งในคอลัมน์นั้นเพิ่มขึ้นอัตโนมัติ?
Brett Widmeier

5
IS SELECTจำเป็น? ไม่ควรUSAGEครอบคลุมสิ่งที่จำเป็น?
TᴀʀᴇǫMᴀʜᴍᴏᴏᴅ

6
@BrettWidmeier อย่างแน่นอน ฉันรู้สึกงุนงงกับสิ่งที่นักพัฒนาเหล่านี้ยอมรับได้ มันเป็นเหมือนคนที่ต้องการท่องไปทั่วอินเทอร์เน็ตและอ่านกระทู้ StackOverflow ที่ลึกที่สุดเพื่อพยายามแก้ไขสิ่งต่าง ๆ ที่ควรจะทำงานได้ทันที
milosmns

67

เนื่องจาก @Phil มีความคิดเห็นที่ได้รับการอัปโหลดจำนวนมากซึ่งอาจไม่ได้สังเกตฉันกำลังใช้ไวยากรณ์ของเขาเพื่อเพิ่มคำตอบที่จะให้สิทธิ์แก่ผู้ใช้สำหรับลำดับทั้งหมดในสคีมา (สมมติว่าสคีมาของคุณเป็นค่าเริ่มต้น 'สาธารณะ' )

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

2
โปรดทราบว่าสิ่งนี้ใช้ได้เฉพาะใน PostgreSQL 9.0 และสูงกว่าเพื่อให้ทำงานอย่างเดียวกันใน 8 คุณสามารถทำสิ่งต่อไปนี้: เลือก 'การใช้งานให้เลือกเลือก' | | quote_ident (schemaname) || '' || quote_ident (relname) || 'ถึง www;' จาก pg_statio_all_sequences WHERE schemaname = 'สาธารณะ'; - Tom Gerken 2 วันก่อน
Tom Gerken

39

@Tom_Gerken, @epic_fil และ @kupson ค่อนข้างถูกต้องกับข้อความสั่งของพวกเขาเพื่อให้สิทธิ์ในการทำงานกับลำดับที่มีอยู่ อย่างไรก็ตามผู้ใช้จะไม่ได้รับสิทธิ์การเข้าถึงลำดับที่สร้างขึ้นในอนาคต ในการทำเช่นนั้นคุณต้องรวมคำสั่ง GRANT เข้ากับคำสั่ง ALTER DEFAULT PRIVILEGES เช่น:

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

ใช้ได้กับ PostgreSQL 9+ เท่านั้น

สิ่งนี้จะผนวกเข้ากับสิทธิ์เริ่มต้นที่มีอยู่ไม่ใช่เขียนทับสิทธิ์เหล่านั้นดังนั้นจึงค่อนข้างปลอดภัยในเรื่องนั้น


-2

ดำเนินการคำสั่งต่อไปนี้ใน postgres

เข้าสู่ระบบเพื่อ postgres:

sudo su postgres;

psql dbname;

สร้างลำดับสาธารณะ public.cities_id_seq INCREMENT 1
ขั้นต่ำ 0 สูงสุดสูงสุด
1
เริ่มต้น 1 แคช 1; เปลี่ยนตาราง public.cities_id_seq เป็นเจ้าของ pgowner;

pgowner จะเป็นผู้ใช้ฐานข้อมูลของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.