search_path สำหรับฐานข้อมูลและผู้ใช้ที่กำหนดคืออะไร


43

ฉันสามารถดูปัจจุบันsearch_pathด้วย:

show search_path ;

และฉันสามารถตั้งค่าsearch_pathสำหรับเซสชันปัจจุบันด้วย:

set search_path = "$user", public, postgis;

เช่นเดียวกับผมอย่างถาวรสามารถตั้งค่าsearch_pathเพื่อให้ฐานข้อมูลด้วย:

alter database mydb set search_path = "$user", public, postgis ;

และฉันสามารถตั้งค่าsearch_pathสำหรับบทบาทที่กำหนด(ผู้ใช้) อย่างถาวรด้วย:

alter role johnny set search_path = "$user", public, postgis ;

แต่ฉันต้องการทราบวิธีการตรวจสอบว่าการตั้งค่าฐานข้อมูลและบทบาทคืออะไร (เกี่ยวกับsearch_path) ก่อนที่จะทำการเปลี่ยนแปลง

คำตอบ:


36

pg_db_role_settingคุณสามารถค้นหาการตั้งค่าสำหรับบทบาทและฐานข้อมูลในตารางแคตตาล็อก

แบบสอบถามนี้ดึงการตั้งค่าใด ๆ สำหรับบทบาทหรือฐานข้อมูลที่กำหนด:

SELECT r.rolname, d.datname, rs.setconfig
FROM   pg_db_role_setting rs
LEFT   JOIN pg_roles      r ON r.oid = rs.setrole
LEFT   JOIN pg_database   d ON d.oid = rs.setdatabase
WHERE  r.rolname = 'myrole' OR d.datname = 'mydb';

หากไม่มีการตั้งค่าอินสแตนซ์ที่ต่ำกว่าถัดไปจะกำหนดสถานะเริ่มต้นของตัวเลือกsearch_pathซึ่งอยู่postgresql.confในกรณีนี้หรือตัวเลือกบรรทัดคำสั่งเมื่อเซิร์ฟเวอร์เริ่มทำงาน ที่เกี่ยวข้อง:

เพื่อล้างค่า ใด ๆการตั้งค่าของบทบาทหรือฐานข้อมูล - The search_pathในตัวอย่างนี้โดยเฉพาะอย่างยิ่ง

ALTER ROLE myrole RESET search_path;

หรือ:

ALTER DATABASE mydb RESET search_path;

หรือ:

ALTER ROLE myrole in DATABASE mydb RESET search_path;

อย่าใช้ข้อมูลในแค็ตตาล็อกระบบ ( pg_catalog.*) ด้วยตนเอง การใช้คำสั่ง DDL ตามคำแนะนำในคู่มือสำหรับและALTER ROLE โดยพื้นฐานแล้วคำสั่งจะลบแถวออกเพื่อให้การตั้งค่าพื้นฐานมีผลอีกครั้ง ฉันจะไม่เรียกสิ่งนั้นว่าซับซ้อนALTER DATABASE
RESETpg_db_role_setting


ว้าว. ฉันไม่ได้คิดว่ามันจะซับซ้อน วิธีที่คุณจะล้างค่าที่กำหนดฐานข้อมูลและบทบาทการตั้งค่า? หลังจากรันalter role myrole set search_path = "$user", public, postgis ;ผมสังเกตเห็นว่าpg_roles.rolconfig(สอดคล้องกับบทบาทของฉัน) {"search_path=\"$user\", public, postgis"}มีค่า นอกจากselect * from pg_db_role_setting ;นี้ตอนนี้จะแสดงแถวเพิ่มเติม และหลังจากดำเนินการalter database mydb set search_path = "$user", public, postgis ;ฉันเห็นแถวที่สอดคล้องกันในselect * from pg_db_role_setting ;ตอนท้ายฉันไม่แน่ใจว่าจะ "เลิกทำ" การเปลี่ยนแปลงเหล่านี้ได้อย่างไร
user664833

@ user664833: ฉันได้เพิ่มคำแนะนำในการยกเลิกการตั้งค่า
Erwin Brandstetter

6

การตั้งค่าถาวรสำหรับทั้งฐานข้อมูลและบทบาทจะถูกเก็บไว้ใน ตารางทั่วทั้งระบบpg_db_role_settings

แสดงเฉพาะการตั้งค่าที่เปลี่ยนแปลง "$user",publicหากเส้นทางการค้นหาก็ไม่เคยแก้ไขฐานข้อมูลหรือบทบาทที่ผมคิดว่ามันสามารถสันนิษฐานว่าจะเป็น

  • ค่าของการตั้งค่าก่อนการเปลี่ยนแปลงใด ๆ รวมถึงที่ระดับคลัสเตอร์ (ผ่านการกำหนดค่าทั่วโลกpostgresql.conf) สามารถสอบถามจากฐานข้อมูลด้วย:

     SELECT boot_val FROM pg_settings WHERE name='search_path';
  • ค่าของการตั้งค่าก่อนการเปลี่ยนแปลงใด ๆภายในเซสชัน (ผ่านSETคำสั่ง) สามารถสอบถามจากฐานข้อมูลด้วย:

     SELECT reset_val FROM pg_settings WHERE name='search_path';
  • เมื่อมีการตั้งค่าที่ไม่ใช่ค่าเริ่มต้นในpostgresql.confก็ไม่ได้ตรงไปตรงมาเพื่อให้ได้ค่าใน SQL ที่เป็นอิสระจากการใช้งานปัจจุบัน pg_settings.boot_valจะไม่ทำเพราะมันไม่สนใจการเปลี่ยนแปลงในแฟ้มการกำหนดค่าและpg_settings.reset_valจะไม่ได้อย่างใดอย่างหนึ่งเพราะได้รับอิทธิพลจากการตั้งค่า / ALTER USER/ALTER DATABASEผู้ใช้ฐานข้อมูลที่อาจเกิดขึ้นตั้งค่าผ่าน วิธีที่ง่ายที่สุดสำหรับ DBA postgresql.confที่จะได้รับมีค่าเป็นเพียงแค่มองมันได้ใน มิฉะนั้นให้ดู รีเซ็ต search_path เป็นค่าเริ่มต้นระดับโลกซึ่งครอบคลุมหัวข้อนี้โดยละเอียด


การboot_valตั้งค่าเริ่มต้นจากโรงงานนั้นไม่ใช่การตั้งค่าpostgresql.confใช่หรือไม่
Erwin Brandstetter

@ เออร์วิน: ใช่ หนึ่งอาจต้องการดูแทนreset_val boot_val
Daniel Vérité

reset_valอืมฐานข้อมูลหรือการตั้งค่าบทบาทเขียนทับค่าใน ฉันพบคำถามเก่านี้เมื่อค้นคว้าคำถามล่าสุดนี้: dba.stackexchange.com/questions/145280/ …
Erwin Brandstetter

@Erwin: ISTM ที่รับค่าจาก postgresql.conf น่าจะเป็นปัญหา XY ในกรณีส่วนใหญ่ อย่างไรก็ตามฉันได้แก้ไขคำตอบเพื่อเชื่อมโยงกับคำถามที่ใหม่กว่าและขยายออกไปเล็กน้อย
Daniel Vérité

3
select * from pg_user;

เป็นจริงสำหรับ postgres และ Redshift ดูเหมือนจะง่ายเกินไปเมื่อเทียบกับคำตอบก่อนหน้าซึ่งขึ้นอยู่กับpg_db_role_settingแต่useconfigคอลัมน์จะมีรายการของการกำหนดค่าผู้ใช้ซึ่งรวมถึงการsearch_pathจัดรูปแบบเป็นรายการ

pg_user เอกสารประกอบ Postgres อยู่ที่นี่

ที่จะเลือกมากขึ้น:

rs.db.batarang.com cooldb:cooldude =#> select usename
                                              , useconfig 
                                       from   pg_user
                                       where  usename = 'cooldude';
┌────────────┬─────────────────────────────────────────────────────┐
  usename                         useconfig                      
├────────────┼─────────────────────────────────────────────────────┤
 cooldude    {"search_path=dirt, test, \"$user\", public, prod"} 
└────────────┴─────────────────────────────────────────────────────┘

ฉันคิดว่าตารางผู้ใช้นี้มีผู้ใช้ทั้งหมดในคลัสเตอร์ไม่ใช่เฉพาะ db แต่ฉันไม่ได้ตรวจสอบ


บทบาทไม่เหมือนกับผู้ใช้ทุกประการ ;)
วิก

Vic คุณอธิบายได้ไหม? เอกสาร Postgres สั้นกระชับและดูเหมือนว่าผู้ใช้และบทบาทไม่มีแนวความคิดที่แตกต่างกันอีกต่อไป แต่ฉันไม่ใช่ DBA และจะรักการป้อนข้อมูลมากขึ้น postgresql.org/docs/current/static/user-manag.html
เมอร์ลิน

2
'บทบาท' ใด ๆ สามารถทำหน้าที่เป็นผู้ใช้กลุ่มหรือทั้งสองอย่าง แต่ผู้ใช้ 'มีความหมายว่ามีความแตกต่างอีกอย่างหนึ่ง ตรวจสอบแคตตาล็อกเราจะเห็นว่ามุมมอง pg_role และ pg_user ทั้งสองอ้างอิงตาราง pg_authid แต่ด้วยคำกริยา rolcanlogin สำหรับผู้ใช้ 'ผู้ใช้' สามารถเข้าสู่ระบบฐานข้อมูลของคุณและโดยทั่วไป 'บทบาท' จะกำหนดชุดการอนุญาตที่ผู้ใช้จะได้รับ
Vic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.