ฉันจะหาคู่มือแนะนำการสอนหรือซีรีย์วิดีโอได้จากที่ไหน
คุณจะพบทุกสิ่งในคู่มือ ลิงค์ด้านล่าง
จริงอยู่ที่เรื่องไม่สำคัญและบางครั้งก็ทำให้สับสน นี่คือสูตรสำหรับกรณีการใช้งาน:
สูตรอาหาร
ฉันต้องการกำหนดค่าเพื่อให้hostdb_admin
สามารถสร้าง (และวางและแก้ไข) ตารางเท่านั้น สามารถอ่านแทรกปรับปรุงและลบในตารางทั้งหมดโดยค่าเริ่มต้น
และสามารถอ่านได้เฉพาะตารางทั้งหมด (และมุมมอง)
hostdb_mgr
hostdb_usr
ในฐานะ superuser postgres
:
CREATE USER schma_admin WITH PASSWORD 'youwish';
-- CREATE USER schma_admin WITH PASSWORD 'youwish' CREATEDB CREATEROLE; -- see below
CREATE USER schma_mgr WITH PASSWORD 'youwish2';
CREATE USER schma_usr WITH PASSWORD 'youwish3';
หากคุณต้องการผู้ดูแลระบบที่มีประสิทธิภาพยิ่งขึ้นซึ่งสามารถจัดการฐานข้อมูลและบทบาทให้เพิ่มคุณสมบัติของบทบาทCREATEDB
และCREATEROLE
ด้านบน
ให้แต่ละบทบาทในระดับที่สูงขึ้นไปดังนั้นทุกระดับ "รับช่วง" อย่างน้อยชุดสิทธิพิเศษจากระดับล่างถัดไป (เรียงซ้อน):
GRANT schma_usr TO schma_mgr;
GRANT schma_mgr TO schma_admin;
CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public; -- see notes below!
GRANT CONNECT ON DATABASE hostdb TO schma_usr; -- others inherit
\connect hostdb -- psql syntax
ฉันกำลังตั้งชื่อสคีมาschma
(ไม่ใช่hostdb
ซึ่งจะทำให้สับสน) เลือกชื่อใด ๆ เลือกที่จะทำให้schma_admin
เจ้าของสกีมา:
CREATE SCHEMA schma AUTHORIZATION schma_admin;
SET search_path = schma; -- see notes
ALTER ROLE schma_admin IN DATABASE hostdb SET search_path = schma; -- not inherited
ALTER ROLE schma_mgr IN DATABASE hostdb SET search_path = schma;
ALTER ROLE schma_usr IN DATABASE hostdb SET search_path = schma;
GRANT USAGE ON SCHEMA schma TO schma_usr;
GRANT CREATE ON SCHEMA schma TO schma_admin;
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT SELECT ON TABLES TO schma_usr; -- only read
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT INSERT, UPDATE, DELETE, TRUNCATE ON TABLES TO schma_mgr; -- + write, TRUNCATE optional
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO schma_mgr; -- SELECT, UPDATE are optional
สำหรับand drop and alter
บันทึกดูด้านล่าง
เมื่อสิ่งต่าง ๆ ก้าวหน้าขึ้นฉันก็จะมีคำถามที่จะใช้ข้อ จำกัด ที่คล้ายกันในTRIGGERS
ขั้นตอนการจัดเก็บVIEWS
และวัตถุอื่น ๆ
... (แต่โปรดทราบว่าALL TABLES
รวมมุมมองและตารางต่างประเทศไว้ด้วย)
และสำหรับมุมมองที่อัปเดตได้ :
โปรดทราบว่าผู้ใช้ที่ดำเนินการแทรกปรับปรุงหรือลบในมุมมองจะต้องมีสิทธิ์ในการแทรกปรับปรุงหรือลบที่สอดคล้องกันในมุมมอง นอกจากนี้เจ้าของมุมมองจะต้องมีสิทธิ์ที่เกี่ยวข้องกับความสัมพันธ์พื้นฐาน แต่ผู้ใช้ที่ดำเนินการอัปเดตไม่ต้องการสิทธิ์ใด ๆ ในความสัมพันธ์พื้นฐานที่เกี่ยวข้อง (ดู
หัวข้อ 38.5 )
ทริกเกอร์ก็พิเศษเช่นกัน คุณต้องการTRIGGER
สิทธิ์พิเศษบนโต๊ะและ:
แต่เรากำลังขยายขอบเขตของคำถามนี้ ...
หมายเหตุสำคัญ
ความเป็นเจ้าของ
หากคุณต้องการอนุญาตschma_admin
(โดยลำพัง) ให้ดร็อปและแก้ไขตารางให้สร้างบทบาทเป็นเจ้าของวัตถุทั้งหมด เอกสารประกอบ:
สิทธิ์ในการวางวัตถุหรือเปลี่ยนแปลงคำจำกัดความในทางใด ๆ จะไม่ถือว่าเป็นสิทธิ์ที่ให้ มันมีอยู่ในเจ้าของและไม่สามารถอนุญาตหรือเพิกถอนได้ (อย่างไรก็ตามสามารถได้รับผลกระทบที่คล้ายกันโดยการให้หรือเพิกถอนการเป็นสมาชิกในบทบาทที่เป็นเจ้าของวัตถุดูด้านล่าง) เจ้าของโดยปริยายมีตัวเลือกการอนุญาตทั้งหมดสำหรับวัตถุด้วย
ALTER TABLE some_tbl OWNER TO schma_admin;
หรือสร้างวัตถุทั้งหมดที่มีบทบาทที่schma_admin
จะเริ่มต้นด้วยดังนั้นคุณไม่จำเป็นต้องตั้งเจ้าของอย่างชัดเจน นอกจากนี้ยังลดความสะดวกในการใช้สิทธิ์เริ่มต้นซึ่งคุณจะต้องตั้งค่าสำหรับบทบาทเดียวเท่านั้น:
วัตถุที่มีอยู่ก่อน
สิทธิ์เริ่มต้นจะใช้กับวัตถุที่สร้างขึ้นใหม่เท่านั้นและเฉพาะกับบทบาทที่สร้างขึ้นเท่านั้น คุณจะต้องปรับเปลี่ยนการอนุญาตสำหรับวัตถุที่มีอยู่ด้วย:
เช่นเดียวกับถ้าคุณสร้างวัตถุที่มีบทบาทที่ไม่ได้ตั้งค่าเช่นใช้ superDEFAULT PRIVILEGES
postgres
โอนสิทธิการเป็นเจ้าของให้schma_admin
และกำหนดสิทธิ์ของตนเอง - หรือการตั้งค่าDEFAULT PRIVILEGES
สำหรับpostgres
เช่นกัน: (ในขณะที่เชื่อมต่อไปทางขวา DB!)
ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ... -- etc.
สิทธิพิเศษเริ่มต้น
คุณพลาดส่วนสำคัญของALTER DEFAULT PRIVILEGES
คำสั่ง มันใช้กับบทบาทปัจจุบันเว้นแต่จะระบุไว้เป็นอย่างอื่น:
สิทธิ์เริ่มต้นจะใช้กับฐานข้อมูลปัจจุบันเท่านั้น ดังนั้นคุณจะไม่ยุ่งกับฐานข้อมูลอื่นในคลัสเตอร์ DB เอกสารประกอบ:
สำหรับวัตถุทั้งหมดที่สร้างขึ้นในฐานข้อมูลปัจจุบัน
คุณอาจต้องการตั้งค่าสิทธิ์เริ่มต้นสำหรับFUNCTIONS
และTYPES
(ไม่ใช่เพียงTABLES
และSEQUENCES
) แต่อาจไม่จำเป็น
สิทธิ์เริ่มต้นสำหรับ PUBLIC
สิทธิ์เริ่มต้นที่มอบให้จะPUBLIC
เป็นพื้นฐานและประเมินค่าสูงโดยบางส่วน เอกสารประกอบ:
PostgreSQL
PUBLIC
ให้สิทธิ์เริ่มต้นในบางชนิดของวัตถุ โดยค่าเริ่มต้นจะไม่มีการมอบสิทธิพิเศษให้PUBLIC
กับตารางคอลัมน์สคีมาหรือพื้นที่ตาราง สำหรับประเภทอื่น ๆ สิทธิ์เริ่มต้นที่มอบให้PUBLIC
มีดังนี้CONNECT
และCREATE TEMP TABLE
ฐานข้อมูล EXECUTE
สิทธิพิเศษสำหรับฟังก์ชั่น; และUSAGE
สิทธิพิเศษสำหรับภาษา
ฉันเน้นตัวหนา โดยทั่วไปแล้วคำสั่งเดียวข้างต้นก็เพียงพอที่จะครอบคลุมทุกอย่าง:
REVOKE ALL ON DATABASE hostdb FROM public;
โดยเฉพาะอย่างยิ่งไม่มีสิทธิ์เริ่มต้นที่จะได้รับPUBLIC
สำหรับสคีมาใหม่ มันอาจจะทำให้เกิดความสับสนว่าคีมาเริ่มต้นการตั้งชื่อว่า "สาธารณะ" เริ่มต้นด้วยสิทธิพิเศษสำหรับALL
PUBLIC
นั่นเป็นเพียงคุณสมบัติอำนวยความสะดวกเพื่อให้ง่ายต่อการเริ่มต้นด้วยฐานข้อมูลที่สร้างขึ้นใหม่ ไม่ส่งผลกระทบต่อสกีมาอื่น ๆ แต่อย่างใด คุณสามารถยกเลิกสิทธิ์เหล่านี้ในฐานข้อมูลแม่แบบtemplate1
จากนั้นฐานข้อมูลที่สร้างขึ้นใหม่ทั้งหมดในคลัสเตอร์นี้จะเริ่มโดยไม่มีสิทธิ์ดังต่อไปนี้:
\connect template1
REVOKE ALL ON SCHEMA public FROM public;
สิทธิพิเศษ TEMP
เนื่องจากเราเพิกถอนสิทธิ์ทั้งหมดในhostdb
จากPUBLIC
ผู้ใช้ทั่วไปจะไม่สามารถสร้างตารางชั่วคราวได้เว้นแต่ว่าเราจะอนุญาตอย่างชัดเจน คุณอาจจะหรืออาจไม่ต้องการเพิ่ม:
GRANT TEMP ON DATABASE hostdb TO schma_mgr;
search_path
search_path
อย่าลืมที่จะตั้ง หากคุณมีฐานข้อมูลเดียวในคลัสเตอร์คุณสามารถตั้งค่าเริ่มต้นส่วนกลางpostgresql.conf
ได้ อื่น ๆ (มีแนวโน้มมากขึ้น) ตั้งเป็นคุณสมบัติของฐานข้อมูลหรือเพียงเพื่อบทบาทที่เกี่ยวข้องหรือแม้กระทั่งการรวมกันของทั้งสอง รายละเอียด:
คุณอาจต้องการตั้งค่าschma, public
หากคุณใช้สคีมาสาธารณะหรือแม้กระทั่ง (โอกาสน้อยกว่า) $user, schma, public
...
อีกทางเลือกหนึ่งคือการใช้สคีมาเริ่มต้น "สาธารณะ" ซึ่งควรทำงานกับการตั้งค่าเริ่มต้นsearch_path
หากคุณไม่ได้เปลี่ยน อย่าลืมเพิกถอนสิทธิ์พิเศษสำหรับPUBLIC
ในกรณีนี้
ที่เกี่ยวข้อง
public
ปลอม มันอาจจะคิดว่าเป็นบทบาทที่ทุก ๆ บทบาท (ผู้ใช้กลุ่ม - เหล่านี้เหมือนกันทั้งหมด) เป็นสมาชิกของREVOKE CREATE ON SCHEMA hostdb FROM public
พยายามที่จะเอาสิทธิ์จากมันโดยยกตัวอย่างเช่น การเพิกถอนสิทธิ์ในระดับฐานข้อมูลอย่างที่คุณทำปิดการใช้งานสิทธิ์ระดับฐานข้อมูลบางอย่างเท่านั้นไม่มีผลกับ schema หรือตาราง