มอบทั้งหมดบนสคีมาเฉพาะในฐานข้อมูลให้กับบทบาทกลุ่มใน PostgreSQL


93

เมื่อใช้ PostgreSQL 9.0 ฉันมีบทบาทกลุ่มที่เรียกว่า "staff" และต้องการให้สิทธิ์ทั้งหมด (หรือบางอย่าง) กับบทบาทนี้บนตารางในสคีมาเฉพาะ ไม่มีงานต่อไปนี้

GRANT ALL ON SCHEMA foo TO staff;
GRANT ALL ON DATABASE mydb TO staff;

สมาชิกของ "staff" ยังไม่สามารถเลือกหรืออัปเดตตารางแต่ละตารางในสคีมา "foo" หรือ (ในกรณีของคำสั่งที่สอง) ไปยังตารางใดก็ได้ในฐานข้อมูลเว้นแต่ฉันจะให้สิทธิ์ทั้งหมดในตารางนั้น

ฉันจะทำอย่างไรให้ชีวิตของฉันและผู้ใช้ง่ายขึ้น

ปรับปรุง:คิดออกด้วยความช่วยเหลือของคำถามที่คล้ายกันใน serverfault.com

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;

คำตอบ:


125

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

(แต่โปรดทราบว่าALL TABLESรวมถึงมุมมองและตารางต่างประเทศ )

ฉันเน้นตัวหนา serialคอลัมน์ถูกนำไปใช้โดยnextval()เรียงตามลำดับเป็นค่าเริ่มต้นของคอลัมน์และอ้างอิงคู่มือ :

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

ดังนั้นหากมีserialคอลัมน์คุณจะต้องให้สิทธิ์USAGE(หรือALL PRIVILEGES) ในลำดับด้วย

GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;

หมายเหตุ: คอลัมน์ข้อมูลประจำตัวใน Postgres 10 ขึ้นไปใช้ลำดับโดยนัยที่ไม่ต้องการสิทธิ์เพิ่มเติม (พิจารณาอัปเกรดserialคอลัมน์)

แล้ววัตถุใหม่ล่ะ?

คุณจะสนใจDEFAULT PRIVILEGESผู้ใช้หรือสคีมาด้วย :

ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT USAGE          ON SEQUENCES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo REVOKE ...;

สิ่งนี้ตั้งค่าสิทธิพิเศษสำหรับอ็อบเจ็กต์ที่สร้างขึ้นในอนาคตโดยอัตโนมัติ แต่ไม่ใช่สำหรับอ็อบเจ็กต์ที่มีอยู่แล้ว

สิทธิพิเศษเริ่มต้นเพียงนำไปใช้กับวัตถุที่สร้างขึ้นโดยผู้ใช้เป้าหมาย ( FOR ROLE my_creating_role) ALTER DEFAULT PRIVILEGESหากข้อที่ถูกละไว้เป็นค่าเริ่มต้นให้กับผู้ใช้ในปัจจุบันการดำเนินการ เพื่อให้ชัดเจน:

ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo GRANT ...;
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo REVOKE ...;

โปรดสังเกตด้วยว่า pgAdmin III ทุกเวอร์ชันมีจุดบกพร่องเล็กน้อยและแสดงสิทธิ์เริ่มต้นในบานหน้าต่าง SQL แม้ว่าจะไม่ได้ใช้กับบทบาทปัจจุบันก็ตาม อย่าลืมปรับFOR ROLEประโยคด้วยตนเองเมื่อคัดลอกสคริปต์ SQL


2
เพื่อให้คุณรู้จักเออร์วิน 10 นาทีหลังจากที่คุณโพสต์คำแนะนำของคุณฉันต้องการมัน เหมือนคุณรู้ว่าฉันกำลังจะทำอะไร ... สร้างตารางใหม่และพบว่ามันไม่มีสิทธิพิเศษ คำตอบของคุณมาเพื่อช่วยเหลือ
punkish

5
@punkish: ฉันต้องการป้ายก่อนหน้าของฉัน! ไอ้นั่นมันใช้อย่างอื่นไปแล้ว
Erwin Brandstetter

เมื่อรันALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;จะรู้ได้อย่างไรว่าฐานข้อมูลอะไร? SCHEMA fooสามารถอยู่ในฐานข้อมูลอื่นได้หรือไม่
J86

2
@ J86: ใช้กับฐานข้อมูลปัจจุบันเท่านั้น - โดยที่คำสั่งถูกเรียกใช้
Erwin Brandstetter

1
@ErwinBrandstetter ฉันสามารถให้สิทธิ์การเข้าถึงตาราง / ลำดับในอนาคตแก่app_user (อ่าน - เขียน) ได้หรือไม่หากตารางจะถูกสร้างขึ้นโดยผู้ใช้migration_userเฉพาะรายอื่นโดยอัตโนมัติ (การโอนย้ายทางบินจะทำงานเมื่อเริ่มต้นแอป)
lexeme

45

คำตอบของฉันมีความคล้ายคลึงกับหนึ่งใน ServerFault.com

จะอนุรักษ์นิยม

หากคุณต้องการอนุรักษ์นิยมมากกว่าการให้ "สิทธิ์ทั้งหมด" คุณอาจต้องการลองสิ่งเหล่านี้เพิ่มเติม

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO some_user_;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO some_user_;

การใช้ที่publicนั่นอ้างถึงชื่อของสคีมาเริ่มต้นที่สร้างขึ้นสำหรับฐานข้อมูล / แค็ตตาล็อกใหม่ทั้งหมด แทนที่ด้วยชื่อของคุณเองหากคุณสร้างสคีมา

การเข้าถึง Schema

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

คุณจะไม่สังเกตเห็นข้อกำหนดนี้เมื่อใช้ Postgres เป็นครั้งแรก publicโดยค่าเริ่มต้นฐานข้อมูลทุกคนมีสคีชื่อแรก และโดยค่าเริ่มต้นผู้ใช้ทุกคนจะได้รับสิทธิ์ "การใช้งาน" โดยอัตโนมัติสำหรับสคีมานั้น ๆ เมื่อเพิ่มสคีมาเพิ่มเติมคุณต้องให้สิทธิ์การใช้งานอย่างชัดเจน

GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;

ตัดตอนมาจากเอกสาร Postgres :

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

สำหรับการสนทนาเพิ่มเติมโปรดดูที่คำถามการใช้ประโยชน์ของ SCHEMA ทำอะไรได้บ้าง? . ให้ความสนใจเป็นพิเศษหาคำตอบจากผู้เชี่ยวชาญ Postgres เครก Ringer

วัตถุที่มีอยู่กับอนาคต

คำสั่งเหล่านี้มีผลกับอ็อบเจ็กต์ที่มีอยู่เท่านั้น ตารางและสิ่งที่คุณสร้างในอนาคตจะได้รับสิทธิ์เริ่มต้นจนกว่าคุณจะดำเนินการตามบรรทัดด้านบนอีกครั้ง ดูคำตอบอื่น ๆ ของ Erwin Brandstetterเพื่อเปลี่ยนค่าเริ่มต้นซึ่งจะส่งผลต่อวัตถุในอนาคต


1
นอกจากสองทุนข้างต้นแล้วยังต้องการอีกหนึ่งทุน: GRANT USAGE ON SCHEMA public TO some_user_;
Ning Liu

1
@ NingLiu ขอบคุณมากสำหรับการชี้ให้เห็นถึงการใช้ประโยชน์และการสอนฉัน ฉันเพิ่มส่วนในคำตอบ
Basil Bourque

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