มอบสิทธิ์ทั้งหมดให้กับผู้ใช้บนฐานข้อมูล


206

ฉันต้องการให้สิทธิ์แก่ผู้ใช้ทั้งหมดในฐานข้อมูลโดยไม่ต้องเป็นผู้ดูแลระบบ เหตุผลที่ฉันต้องการทำนั่นคือในขณะนี้ DEV และ PROD เป็นฐานข้อมูลที่แตกต่างกันในคลัสเตอร์เดียวกันดังนั้นฉันไม่ต้องการให้ผู้ใช้สามารถเปลี่ยนวัตถุการผลิต แต่ต้องสามารถเปลี่ยนวัตถุบน DEV

ฉันเหนื่อย:

grant ALL on database MY_DB to group MY_GROUP;

แต่ดูเหมือนจะไม่ได้รับอนุญาตใด ๆ

จากนั้นฉันก็ลอง:

grant all privileges on schema MY_SCHEMA to group MY_GROUP;

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

ฉันสามารถดำเนินการต่อโดยให้สิทธิ์การใช้งานกับผู้ใช้บน MY_SCHEMA แต่จากนั้นจะบ่นเกี่ยวกับการไม่มีสิทธิ์บนโต๊ะ ...

ดังนั้นฉันเดาคำถามของฉันคือ: มีวิธีง่าย ๆ ให้สิทธิ์ทั้งหมดแก่ผู้ใช้ในฐานข้อมูลหรือไม่

ฉันกำลังทำงานกับ PostgreSQL 8.1.23

คำตอบ:


271

ผู้ใช้ต้องการเข้าถึงฐานข้อมูลอย่างชัดเจน:

GRANT CONNECT ON DATABASE my_db TO my_user;

และ (อย่างน้อย) USAGEสิทธิ์บนสคีมา :

GRANT USAGE ON SCHEMA public TO my_user;

หรือให้สิทธิ์USAGEกับสกีมาที่กำหนดเองทั้งหมด :

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

จากนั้นสิทธิ์ทั้งหมดสำหรับตารางทั้งหมด(ต้องใช้ Postgres 9.0หรือใหม่กว่า)
และอย่าลืมลำดับ (ถ้ามี):

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

สำหรับรุ่นเก่ากว่าคุณสามารถใช้ "Grant Wizard" ของ pgAdmin III (GUI เริ่มต้น)

มีบางวัตถุอื่น ๆคู่มือสำหรับGRANTมีรายการทั้งหมดตั้งแต่ Postgres 12:

สิทธิ์บนวัตถุฐานข้อมูล (ตาราง, คอลัมน์, มุมมอง, ตารางต่างประเทศ, ลำดับ, ฐานข้อมูล, wrapper ข้อมูลต่างประเทศ, เซิร์ฟเวอร์ต่างประเทศ, ฟังก์ชัน, โพรซีเดอร์, ภาษาโพรซีเดอร์, สคีมาหรือสเปซสเปซ)

แต่ส่วนที่เหลือไม่ค่อยจำเป็น รายละเอียดเพิ่มเติม:

พิจารณาอัพเกรดเป็นรุ่นปัจจุบัน


133
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;

24
การให้สิทธิ์ทั้งหมดON DATABASEฟังดูยิ่งใหญ่ แต่ไม่ได้ทำอะไรมาก มันเป็นเพียงการเริ่มต้น ไม่ให้สิทธิ์ใด ๆ กับวัตถุที่มีอยู่
Erwin Brandstetter

50

ใน PostgreSQL 9.0+ คุณต้องทำสิ่งต่อไปนี้:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP;

หากคุณต้องการเปิดใช้งานสิ่งนี้สำหรับความสัมพันธ์ที่สร้างขึ้นใหม่ด้วยให้ตั้งค่าการอนุญาตเริ่มต้น:

ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP;
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP;

อย่างไรก็ตามการเห็นว่าคุณใช้ 8.1 คุณต้องเขียนโค้ดด้วยตัวเอง:

CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS integer AS $$
DECLARE
  rel RECORD;
BEGIN
  FOR rel IN
    SELECT c.relname
    FROM pg_class c
    JOIN pg_namespace s ON c.namespace = s.oid
    WHERE s.nspname = schname
  LOOP
    EXECUTE 'GRANT ALL PRIVILEGES ON ' || quote_ident(schname) || '.' || rel.relname || ' TO ' || quote_ident(grant_to);
  END LOOP;
  RETURN 1;
END; $$ LANGUAGE plpgsql STRICT;
REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC;

นี้จะกำหนดสิทธิพิเศษในทุกความสัมพันธ์: ตารางวิวดัชนีลำดับ ฯลฯ หากคุณต้องการ จำกัด pg_class.relkindที่กรอง ดูเอกสาร pg_classสำหรับรายละเอียด

คุณควรใช้งานฟังก์ชั่นนี้เป็น superuser และปกติตามที่แอปพลิเคชันของคุณต้องการ ตัวเลือกจะแพคเกจนี้ในงาน cron ที่ดำเนินการทุกวันหรือทุกชั่วโมง


สวัสดี Patrick "ALL TABLES" ไม่มีให้ใน 8.1 ( postgresql.org/docs/8.1/static/sql-grant.html ) ฉันรู้ว่าฉันสามารถวนดูตารางต่างๆและให้สิทธิ์เป็นรายบุคคล แต่นี่คือสิ่งที่ฉัน พยายามหลีกเลี่ยง แต่ขอบคุณสำหรับความช่วยเหลือของคุณ
Diego

@Diego: เพิ่มโซลูชันสำหรับ 8.1
Patrick

ขอบคุณแพทริคฉันใช้สิ่งที่คุณทำ แต่ไม่ใช้ "แกรนท์ทั้งหมด" ด้วยเหตุผลบางอย่างดูเหมือนจะไม่ทำอะไรเลย สำหรับ exampe ฉันวิ่ง: ให้สิทธิ์ทั้งหมดในการทดสอบสคีมากับ userA; แต่หลังจากนั้น userA นั้นยังคงไม่สามารถเข้าถึงการอ่านจากตารางในการทดสอบสคีมา
Diego

2
คุณควรให้สิทธิ์ใช้งานกับสคีมา จากนั้นในความสัมพันธ์ทั้งหมดภายในสคีมานั้น (ตารางมุมมองลำดับดัชนี ฯลฯ ) คุณจะต้องเลือก GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE แยกต่างหาก Schemas เป็นเนมสเปซความสัมพันธ์เป็นที่ซึ่งข้อมูลของคุณอยู่
Patrick

28

ฉันทำสิ่งต่อไปนี้เพื่อเพิ่มบทบาท 'eSumit' ในฐานข้อมูล PostgreSQL 9.4.15 และให้สิทธิ์ทั้งหมดกับบทบาทนี้:

CREATE ROLE eSumit;

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO eSumit;

GRANT ALL PRIVILEGES ON DATABASE "postgres" to eSumit;

ALTER USER eSumit WITH SUPERUSER;

ตรวจสอบการป้อน pg_table ด้วย:

เลือก * จาก pg_roles; ป้อนคำอธิบายรูปภาพที่นี่

สแนปชอตของฐานข้อมูล: ป้อนคำอธิบายรูปภาพที่นี่


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