ให้สิทธิ์การเข้าถึงตารางทั้งหมดสำหรับผู้ใช้


151

ฉันใหม่สำหรับ Postgres และพยายามย้ายฐานข้อมูล MySQL ของเราไป ใน MySQL ฉันสามารถให้สิทธิ์SELECT, UPDATE, INSERTและDELETEสิทธิพิเศษในการใช้สิทธิพิเศษต่ำและเปิดใช้ทุนเหล่านั้นเพื่อนำไปใช้กับตารางทั้งหมดในฐานข้อมูลที่ระบุ ฉันต้องหายไปบางอย่างใน Postgres เพราะดูเหมือนว่าฉันต้องให้สิทธิ์เหล่านั้นสำหรับแต่ละตารางทีละครั้ง ด้วยฐานข้อมูลจำนวนมากและหลายร้อยตารางต่อฐานข้อมูลที่ดูเหมือนว่าเป็นงานที่น่ากลัวเพียงเพื่อออกจากพื้นดิน นอกจากนี้เมื่อฐานข้อมูลทำงานอยู่การเพิ่มตารางเกิดขึ้นบ่อยครั้งพอที่ฉันไม่ต้องการให้สิทธิ์ในแต่ละครั้งเว้นแต่จะจำเป็นจริงๆ

สิ่งนี้สำเร็จได้ดีที่สุดอย่างไร

คำตอบ:


175

ก่อนอื่นคุณจะต้องสามารถเชื่อมต่อกับฐานข้อมูลเพื่อเรียกใช้แบบสอบถาม สามารถทำได้โดย

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

GRANT CONNECT
ON DATABASE database_name 
TO user_name;

REVOKEเป็นสิ่งจำเป็นเพราะ

คำสำคัญสาธารณะหมายถึงสิทธิพิเศษที่จะมอบให้กับบทบาททั้งหมดรวมถึงสิทธิ์ที่อาจสร้างขึ้นในภายหลัง PUBLIC อาจถูกมองว่าเป็นกลุ่มที่นิยามโดยนัยซึ่งรวมถึงบทบาททั้งหมดเสมอ บทบาทเฉพาะใด ๆ จะมีผลรวมของสิทธิพิเศษที่มอบให้โดยตรงสิทธิพิเศษที่มอบให้กับบทบาทใดก็ตามที่สมาชิกปัจจุบันและสิทธิประโยชน์ที่มอบให้แก่สาธารณะ

หากคุณต้องการ จำกัด ผู้ใช้ของคุณไปยังคำสั่ง DML คุณต้องทำมากกว่านั้น:

REVOKE ALL
ON ALL TABLES IN SCHEMA public 
FROM PUBLIC;

GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public 
TO user_name;

สิ่งเหล่านี้สมมติว่าคุณจะมีเพียงหนึ่งสกีมา (ซึ่งมีชื่อว่า 'สาธารณะ' โดยค่าเริ่มต้น)

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

ALTER DEFAULT PRIVILEGES 
    FOR ROLE some_role   -- Alternatively "FOR USER"
    IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;

นี่some_roleคือบทบาทที่สร้างตารางในขณะที่user_nameเป็นผู้ที่ได้รับสิทธิ์ การกำหนดสิ่งนี้คุณจะต้องเข้าสู่ระบบในฐานะsome_roleสมาชิกของหรือ

และในที่สุดคุณต้องทำแบบเดียวกันกับลำดับ (ขอบคุณ PlaidFan สำหรับการชี้ออก) - ที่นี่เป็นUSAGEสิทธิ์พิเศษที่คุณต้องการ


1
ขอขอบคุณFOR some_roleเป็นส่วนสำคัญที่ฉันไม่ได้ทำเพื่อสร้างตารางของฉันในภายหลัง แต่ฉันไม่จำเป็นต้องเข้าสู่ระบบเพราะsome_roleมันใช้งานได้เช่นกันหากฉันเรียกใช้แบบสอบถามเป็นผู้postgresใช้ที่เป็นผู้ดูแลระบบเริ่มต้น
JustAMartin

54

สมมติว่าคุณต้องการให้สิทธิ์ทั้งหมดแก่พวกเขา - ทำสิ่งนี้:

grant all privileges on database dbname to dbuser;

โดยที่dbnameเป็นชื่อของฐานข้อมูลของคุณและdbuserเป็นชื่อของผู้ใช้


44
นี้จะเพิ่มสิทธิพิเศษดังต่อไปนี้ในฐานข้อมูลCREATE, CONNECT, TEMPORARY : ไม่มีสิทธิ์พิเศษบนโต๊ะ
dezso

13
คำสั่งที่คล้ายกันสำหรับตารางทั้งหมดจะเป็นGRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
Dolan Antenucci

5
ฉันพบว่ามีประโยชน์เช่นนี้ด้วยGRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
เปาโล

18

การให้สิทธิ์ทั้งหมดกับตารางทั้งหมดในฐานข้อมูลนั้นทำได้ด้วย

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;

15

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

เพื่อให้สิทธิ์ที่จะตั้งค่าอย่างถูกต้องสำหรับผู้ใช้ของฉันในตารางใหม่ที่สร้างขึ้นฉันต้องตั้งค่าการอนุญาตเริ่มต้นสำหรับผู้ใช้:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;

2
--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.