ข้อผิดพลาด: ไม่ได้เลือกสคีมาที่จะสร้าง


38

ฉันกำลังทำงานกับฐานข้อมูล postgresql ของ amazon RDS ที่ฉันรู้ว่ามีปัญหากับสคีมาสาธารณะ (อาจถูกทิ้ง) แต่เห็นได้ชัดว่าสคีมามีอยู่แล้วและปัญหายังไม่ได้รับการแก้ไข นี่คือตัวอย่างเซสชันที่มีฐานข้อมูลเปล่าที่สร้างขึ้นใหม่:

mydb=> CREATE TABLE distributors (
mydb(>     did     integer,
mydb(>     name    varchar(40) UNIQUE
mydb(> );
ERROR:  no schema has been selected to create in
mydb=> show search_path;
  search_path   
----------------
 "$user",public
(1 row)

mydb=> create schema public;
ERROR:  schema "public" already exists

คำใบ้ใด ๆ ฉันควรมองหาอะไร

แก้ไข ขอบคุณคำตอบของ Daniel Véritéฉันแก้ไขด้วยต่อไปนี้:

grant usage on schema public to public;
grant create on schema public to public;

นี่เป็นสิทธิ์เริ่มต้นบนสคีมาสาธารณะหรือไม่

ฉันมีผู้ใช้คนเดียวที่สามารถเข้าถึงฐานข้อมูลได้ดังนั้นฉันคิดว่านี่คงไม่สามารถเพิ่มความเสี่ยงด้านความปลอดภัย ...

ผมคิดว่าผมควรจะทำให้การปรับเปลี่ยนเช่นเดียวกันกับtemplate1 ถูกต้องหรือไม่ ฉันจะตรวจสอบได้อย่างไรว่าสิทธิ์ใน template1 นั้นถูกต้อง (พูดค่าเริ่มต้น)?


3
บางทีผู้ใช้ของคุณอาจไม่มีสิทธิ์ที่จำเป็นในการสร้างตารางในสคีมาสาธารณะ
a_horse_with_no_name

การแก้ไขต่อไปนี้: ใช่เชื่อมต่อกับ template1 และตรวจสอบสิทธิ์สคีมา (ดูคำตอบที่แก้ไข)
Daniel Vérité

คำตอบ:


34

นี้เกิดขึ้นเมื่อไม่ได้มีUSAGEสิทธิพิเศษใด ๆ search_pathของสกีมาของ โดยค่าเริ่มต้นบทบาทหลอกpublic(ผู้ใช้ทั้งหมด) มีสิทธิ์นี้ในpublicสคีมาดังนั้นข้อผิดพลาดนี้จะเกิดขึ้นหลังจากยกเลิกมันอย่างชัดเจนด้วย:

revoke usage on schema public from public;

สิ่งนี้จำเป็นเมื่อไม่ต้องการให้ผู้อื่นมองเข้าไปใน schema ของคนอื่นแม้ว่าจะไม่ได้เลือกข้อมูลจากตาราง (ซึ่งได้รับสิทธิพิเศษต่าง ๆ )

หากREVOKEยังไม่ได้ทำในฐานข้อมูลนั้นอาจเกิดขึ้นในฐานข้อมูลแม่แบบที่ฐานข้อมูลใหม่จะถูกสร้างแบบจำลอง (ดูCREATE DATABASE)


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

ในการตรวจสอบสิทธิพิเศษภายใน psql \dn+ publicใช้

ตามค่าเริ่มต้น (แสดงด้วยจอแสดงผลแบบขยาย\xเพื่อความสะดวกในการอ่าน):

# \ dn + สาธารณะ
รายชื่อของ schemas
- [บันทึก 1] ----- + -----------------------
ชื่อ | สาธารณะ
เจ้าของ | postgres
สิทธิ์การเข้าถึง postgres = UC / postgres
                  | = UC / postgres
คำอธิบาย | คีมาสาธารณะมาตรฐาน

ไม่มีชื่อไฟล์ก่อนหน้า=หมายความว่าเป็นบทบาททั้งหมด (= สาธารณะ)

ไม่มีสิทธิ์การใช้งานสาธารณะ

ชื่อ | สาธารณะ
เจ้าของ | postgres
สิทธิ์การเข้าถึง postgres = UC / postgres
                  | = C / postgres
คำอธิบาย | คีมาสาธารณะมาตรฐาน

ไม่มีสิทธิ์การใช้แบบสาธารณะหรือสร้าง

ชื่อ | สาธารณะ
เจ้าของ | postgres
สิทธิ์การเข้าถึง postgres = UC / postgres
คำอธิบาย | คีมาสาธารณะมาตรฐาน

ขอบคุณสิ่งนี้ได้รับการแก้ไขแล้ว! (ฉันจะเขียนบันทึกในคำถาม)
Emanuele Paolini

3

ฉันมีไฟล์ pgdump ที่มีการสร้างฟังก์ชั่นในสคีมาที่กำหนดเองและฉันต้องการที่จะเปลี่ยนชื่อสคีมาที่กำหนดเองเป็นสาธารณะทั่วไปและแทนที่สิ่งที่เกิดขึ้นทั้งหมดด้วยสคีมาเก่าเป็นที่ว่างเปล่า (เช่น myschema.tablename เป็น tablename) และเริ่มรับข้อผิดพลาด

ERROR:  no schema has been selected to create in

สำหรับข้อผิดพลาดกรณีของฉันเกิดขึ้นเมื่อที่จุดเริ่มต้นของการถ่ายโอนข้อมูลบรรทัด

SELECT pg_catalog.set_config('search_path', '', false);

ฉันได้เปลี่ยน ARG ที่สองเป็น "สาธารณะ"

SELECT pg_catalog.set_config('search_path', 'public', false);

และปัญหาก็หมดไป

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