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


12

ฉันใช้ SQL ต่อไปนี้เป็น psql:

CREATE USER bspu LOGIN;

CREATE DATABASE bsp OWNER bspu;

GRANT ALL PRIVILEGES ON DATABASE bsp TO bspu;

\c bsp

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  client_id VARCHAR(20) NOT NULL,
  api_key VARCHAR(100) NOT NULL,
  api_secret VARCHAR(100) NOT NULL,
  auth_token VARCHAR(128) NOT NULL
);

เมื่อฉันเข้าสู่ระบบเป็นbspuและพยายามค้นหาusersตารางฉันได้รับข้อผิดพลาด:

permission denied for relation users

ฉันพยายามวิ่ง

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;

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

แก้ไข: ฉันอัปเกรดbspuเป็น superuser แล้วในตอนนี้ดังนั้นฉันจึงสามารถทำงานต่อไปได้ คำแนะนำเพิ่มเติมชื่นชมใด ๆ


ผลลัพธ์ของการ\dt "users"แสดงอะไร
bma

@bma มีการระบุไว้ในบัญชีหลักของฉันเท่านั้น
ถ้า __name__ ไม่มี

คุณรันคำสั่งเริ่มต้นเป็นผู้ใช้อะไร คุณได้อะไรจากSELECT session_user, current_userส่วนบนสุดของสคริปต์ และรุ่น Postgres ของคุณคืออะไร?
Erwin Brandstetter

หากคำสั่งเหล่านี้เป็นคำสั่งที่แน่นอนที่คุณเรียกใช้คุณจะยังคงเชื่อมต่อกับ 'อุปกรณ์หลัก' ดังนั้นคุณจะได้รับสิทธิพิเศษอะไรบ้าง มิฉะนั้นดูคำตอบที่ยอดเยี่ยมของ Erwin (ผมขอยอมรับว่าผมรู้สึกว่ามันเป็นใบ้ว่าข้อผิดพลาดนี้ไม่ได้บอกบทบาทที่ไม่ได้รับอนุญาตยกตัวอย่างเช่นเมื่อหนึ่งวิ่งห่วงโซ่ของฟังก์ชั่นที่มีความปลอดภัย definer ก็สวยได้อย่างรวดเร็วได้รับความสับสนว่าใครเป็นใคร..)
Dezso

คำตอบ:


22

DEFAULT PRIVILEGESจะไม่เปลี่ยนแปลงสิทธิ์สำหรับที่มีอยู่วัตถุ พวกเขาเป็นสิทธิ์เริ่มต้นสำหรับวัตถุที่สร้างขึ้นใหม่และเฉพาะสำหรับบทบาทเฉพาะที่เป็นของพวกเขา หากคุณไม่ได้กำหนดบทบาทเมื่อเรียกใช้ALTER DEFAULT PRIVILEGESจะมีการตั้งค่าเริ่มต้นเป็นบทบาทปัจจุบัน (เมื่อดำเนินการALTER DEFAULT PRIVILEGESคำสั่ง

นอกจากนี้เนื่องจากคุณใช้serialคอลัมน์ซึ่งสร้าง a SEQUENCEคุณจะต้องกำหนดสิทธิ์เริ่มต้นสำหรับลำดับเช่นกัน

รันสิ่งนี้กับผู้ใช้ที่คุณสร้างวัตถุด้วยก่อนที่คุณจะรันCREATEคำสั่ง:

ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON TABLES TO bspu;
ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON SEQUENCES TO bspu;

หากคุณควรใช้ pgAdmin คำเตือน มีข้อผิดพลาดในรุ่นปัจจุบัน 1.20 (หรือมากกว่า) ในการแสดงผลของสคริปต์ SQL DEFAULT PRIVILEGESวิศวกรรมย้อนกลับคือ จอแสดงผลจะไม่สนใจผู้ใช้ที่เป็นเจ้าของและดังนั้นจึงไม่ถูกต้องในบางสถานการณ์ ผมรายงานข้อผิดพลาดเรื่องอยู่ระหว่างการพิจารณา

สำหรับวัตถุที่มีอยู่คุณอาจสนใจในรูปแบบ "แบทช์" ของGRANTคำสั่งนี้ :

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

เพิ่มเติมภายใต้คำถามที่เกี่ยวข้องใน SO:


1
ข้อผิดพลาดที่กล่าวถึงยังคงมีอยู่ใน pgAdmin4 ดูredmine.postgresql.org/issues/4685ซึ่งถูกตั้งค่าสถานะซ้ำกับredmine.postgresql.org/issues/4256
dpprdan

-1
This is working for me after some research. psql (9.6.12)

-- login to postgres database server as postgres user.
ssh <user>>@hostname.<domain>>.com
sudo su postgres
id
psql
postgres=# create user sentry_read with login password 'sentry_read';
postgres=# du+
postgres=# \l+
-- **very important: make sure we should connect required database before we grant to user.**
postgres=# \c sentry
postgres=# \dt
sentry=# \dp SENTRY_VERSION
sentry=# select * from "SENTRY_VERSION";
sentry=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO sentry_read;
postgres=# \q

[user@hostname ~]$ psql -U sentry_read -d sentry -h hostname.<domain>>.com -W
sentry=> select * from "SENTRY_VERSION";
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.