ปฏิเสธการอนุญาตสำหรับความสัมพันธ์


329

ฉันพยายามรันคำสั่ง sql แบบง่าย:

select * from site_adzone;

และฉันได้รับข้อผิดพลาดนี้

ERROR:  permission denied for relation site_adzone

สิ่งที่อาจเป็นปัญหาที่นี่?

ฉันยังพยายามที่จะเลือกสำหรับตารางอื่นและมีปัญหาเดียวกัน ฉันก็พยายามทำสิ่งนี้:

GRANT ALL PRIVILEGES ON DATABASE jerry to tom;

แต่ฉันได้รับการตอบสนองนี้จากคอนโซล

WARNING:  no privileges were granted for "jerry"

คุณมีความคิดว่าจะเกิดอะไรขึ้น?


ฉันไม่แน่ใจว่าจะอัปเดตการอนุญาตอย่างไรเพื่อให้สามารถอ่าน / เขียนใน DB
Boban

1
คุณต้องให้สิทธิ์พิเศษที่จำเป็น: postgresql.org/docs/current/static/ddl-priv.htmlและpostgresql.org/docs/current/static/sql-grant.html
a_horse_with_no_name

2
ยินดีต้อนรับสู่ SO! สำหรับคำถามนี้คุณอาจได้รับความช่วยเหลือเพิ่มเติมมากกว่าที่ dba.stackexchange.com แม้ว่าคุณอาจพบเพียงเป็นความคิดเห็นเยาะเย้ยหลาย :)
Jared เบ็ค

10
ขออนุญาต. นี่เป็นคำถาม postgresql ที่เกี่ยวข้องกับการเขียนโปรแกรมที่สองที่ฉันเคยเห็นว่าเป็นหัวข้อนอกคืนนี้! อันสุดท้ายมี 67,000 วิวอันนี่ 30,000 วิว เราควรมีประโยคความนิยม: คำถามที่ไม่ใช่อัตนัยที่มี> 15,000 views = ในหัวข้อ
Theodore R. Smith

1
คำถามนี้ไม่ได้อยู่นอกหัวข้อ! อย่างไรก็ตามเป็นความซ้ำซ้อนของstackoverflow.com/questions/13497352/ …
วีตที่

คำตอบ:


391

GRANT ในฐานข้อมูลไม่ใช่สิ่งที่คุณต้องการ ให้สิทธิ์บนโต๊ะโดยตรง

การให้สิทธิพิเศษในฐานข้อมูลส่วนใหญ่จะใช้เพื่อให้หรือเพิกถอนสิทธิ์การเชื่อมต่อ สิ่งนี้อนุญาตให้คุณระบุผู้ที่อาจทำสิ่งใดในฐานข้อมูลหากพวกเขามีสิทธิ์อื่น ๆ เพียงพอ

คุณต้องการแทน:

 GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry;

สิ่งนี้จะดูแลปัญหานี้


7
เรียกใช้เป็น superuser เช่น postgres
Chris Travers

19
นี่เป็นทางลัดได้ไหม? ให้สิทธิ์ทั้งหมดบนแท็บเล็ตทั้งหมดหรือไม่
Shadur

196
@Shadur ให้สิทธิ์แก่ทุกคนบนแท็บเล็ตทั้งหมดในสคีมาสาธารณะถึง jerry;
Ron E

10
@RonE ถูก จำกัด ไว้ที่ฐานข้อมูลปัจจุบันใช่ไหม?
Shadur

7
@zmiftah สำหรับสคีมาที่คุณต้องการ> ให้สิทธิ์แก่ผู้ใช้ทั้งหมดบนชื่อ schema ชื่อ schema ถึงผู้ใช้;
Pierozi

241

การโพสต์คำตอบ Ron E เพื่อรับสิทธิพิเศษในทุกโต๊ะ

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

21
นอกจากนี้คุณยังอาจต้องดำเนินการคำสั่งที่คล้ายกันสำหรับและALL SEQUENCES ALL FUNCTIONS
Pistos

7
สำหรับผู้ที่สงสัย: ALL TABLESยังรวมถึงมุมมองดังนั้นจึงไม่มีALL VIEWSคำสั่งแยกต่างหาก:-)
André Gasser

74

เชื่อมต่อกับฐานข้อมูลที่ถูกต้องก่อนจากนั้นจึงรัน:

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

4
ขอบคุณที่เชื่อมต่อกับฐานข้อมูลที่ถูกต้องไม่ใช่ฉันทำไปก่อนหน้านี้!
asgs

15
เชื่อมต่อกับฐานข้อมูลที่ถูกต้องทำให้ dufference ใหญ่ :)\connect databasename;
เดนิส Matafonov

3
นี้. ฉันเชื่อมต่อกับ "postgres" มาตลอด ขอบคุณ!
Andrew G.

2
ใช่การเชื่อมต่อกับฐานข้อมูลสร้างความแตกต่าง
inostia

44
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public to jerry;

anwser นี้บันทึกวันของฉัน!
anhtran

19

ขั้นตอนแรกและที่สำคัญคือเชื่อมต่อกับฐานข้อมูลของคุณ:

psql -d yourDBName

2 ขั้นตอนให้สิทธิ์

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

18

หากต้องการให้สิทธิ์กับตารางที่มีอยู่ทั้งหมดในสคีมาให้ใช้:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema> TO <role>

ในการระบุสิทธิ์เริ่มต้นที่จะใช้กับตารางในอนาคตให้ใช้:

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> 
  GRANT <privileges> ON TABLES TO <role>;

เช่น

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO admin;

หากคุณใช้SERIALหรือBIGSERIALคอลัมน์คุณอาจต้องการทำสิ่งเดียวกันSEQUENCESหรือมิฉะนั้นคุณINSERTจะล้มเหลว ( Postgres 10IDENTITYไม่ประสบปัญหานั้นและแนะนำให้ใช้ในทุกSERIALประเภท) เช่น

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> GRANT ALL ON SEQUENCES TO <role>;

ดูคำตอบของฉันสำหรับสิทธิ์ PostgreSQL สำหรับ Web Appสำหรับรายละเอียดเพิ่มเติมและสคริปต์ที่ใช้ซ้ำได้

Ref:

GRANT

เปลี่ยนแปลงสิทธิ์เริ่มต้น


9

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

alter table <TABLE> owner to <USER>;

5

ตรวจสอบให้แน่ใจว่าคุณเข้าสู่ psql ในฐานะเจ้าของตาราง เพื่อดูว่าใครเป็นเจ้าของตารางใช้\dt

psql -h CONNECTION_STRING DBNAME -U OWNER_OF_THE_TABLES

จากนั้นคุณสามารถเรียกใช้แกรนท์


0

ในขณะที่คุณกำลังมองหาสิทธิ์เลือกฉันจะแนะนำให้คุณเลือกเฉพาะสิทธิ์มากกว่าสิทธิ์ทั้งหมด คุณสามารถทำได้โดย:

GRANT SELECT ON <table> TO <role>;

0

คุณควร:

  1. เชื่อมต่อกับฐานข้อมูลโดยใช้ DBeaver กับผู้ใช้ postgres
  2. บนแท็บด้านซ้ายเปิดฐานข้อมูลของคุณ
  3. เปิดแท็บบทบาท / ดร็อปดาวน์
  4. เลือกผู้ใช้ของคุณ
  5. บนแท็บด้านขวากด 'แท็บสิทธิ์'
  6. กดที่แท็บสคีมาของคุณ
  7. กดแท็บตาราง / แบบเลื่อนลง
  8. เลือกตารางทั้งหมด
  9. เลือกช่องทำเครื่องหมายการอนุญาตที่จำเป็นทั้งหมด (หรือกด Grant ทั้งหมด)
  10. กดบันทึก

-3

ฉันต้องเผชิญกับปัญหานี้อีกครั้ง เพียงแค่เปลี่ยนผู้ใช้ฐานข้อมูลเป็น superuser และปัญหาของคุณได้รับการแก้ไขแล้ว

เปลี่ยนผู้ใช้ myuser ด้วย SUPERUSER


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