แนะนำให้ติดตั้งส่วนขยายในสคีมา pg_catalog หรือไม่


คำตอบ:


16

ไม่ได้ติดตั้งส่วนขยายpg_catalog(ยกเว้นกรณีที่เริ่มต้นของพวกเขาน้อยมากส่วนขยายได้รับการออกแบบที่เดียว) เพราะคุณจะไม่ยุ่งกับแคตตาล็อกระบบที่เคย @Chrisแสดงเหตุผลหนึ่งว่าทำไม มีคนอื่น ๆ

อย่างไรก็ตามสคีมา "สาธารณะ" ไม่ได้มีความพิเศษอะไร เป็นเพียงสกีมาเริ่มต้นที่ติดตั้งไว้ล่วงหน้าในการแจกแจงมาตรฐานเพื่อให้เราสามารถเริ่มต้นได้ทันที ผู้ดูแลฐานข้อมูลบางคนไม่ได้ใช้สคีมา "สาธารณะ" เลยแม้แต่บางคนก็ลบมันออกไป

CREATE EXTENSIONไม่มีส่วนเกี่ยวข้องกับสคีมา "สาธารณะ" มันจะติดตั้งลงในสคีมาปัจจุบันเว้นแต่จะได้รับคำแนะนำเป็นอย่างอื่น - ยกเว้นว่าส่วนขยายบางส่วนมีสคีมาที่ตั้งไว้ล่วงหน้า (เช่นPGQ / Londiste ) เอกสารประกอบ:

schema_name

ชื่อของสคีมาที่จะติดตั้งวัตถุของส่วนขยายเนื่องจากส่วนขยายช่วยให้สามารถย้ายเนื้อหาได้ สกีมาที่มีชื่อจะต้องมีอยู่แล้ว หากไม่มีการระบุและควบคุมแฟ้มของส่วนขยายไม่ได้ระบุสคีมาทั้งคีมาสร้างวัตถุเริ่มต้นปัจจุบันถูกนำมาใช้

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

เหมืองเน้นหนัก
ตัดสินใจว่าจะจัดการผู้ใช้สคีมาและsearch_path:

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

ฉันต้องการติดตั้งส่วนขยาย (ที่อนุญาต) ในสคีมา "ส่วนขยาย" เฉพาะซึ่งฉันรวมไว้ในค่าเริ่มต้นsearch_path หลังจาก "สาธารณะ" (และ "ผู้ใช้ $" - หากคุณใช้) ช่วยในการแยกฟังก์ชั่นสาธารณะของฉันเองและวัตถุสาธารณะอื่น ๆ การตั้งค่าของฉันในpostgresql.conf:

search_path = "$user",public,extensions

หรือ:

search_path = public,extensions

และฉันติดตั้งส่วนขยายด้วย:

CREATE EXTENSION some_extension SCHEMA extensions;

สิ่งหนึ่งที่ควรทราบ: วิธีนี้คุณสามารถ "ซ่อน" (ไม่มีเงื่อนไข) วัตถุในextensionsสคีมาด้านหลังวัตถุที่มีชื่อเดียวกัน (และพารามิเตอร์) ในpublicสคีมา

ที่เกี่ยวข้อง:


ตกลงเป็นplpgsqlส่วนขยายแล้วอย่างใดข้อยกเว้นกฎนี้ ทุกการติดตั้งที่ฉันได้เห็นมีส่วนขยายนี้ใน pg_catalog
zam6ak

@ zam6ak: ใช่แล้ว plpgsql เป็นกรณีพิเศษ: อ้างอิงจากคู่มือ :In PostgreSQL 9.0 and later, PL/pgSQL is installed by default. However it is still a loadable module, so especially security-conscious administrators could choose to remove it.
Erwin Brandstetter

1
plv8 ติดตั้งตัวเองpg_catalogเช่นกัน (มันจะพ่นข้อผิดพลาดถ้าคุณพยายามที่จะเปลี่ยนมัน) นี่อาจเป็นมาตรฐานสำหรับการติดตั้งส่วนขยายภาษาขั้นตอนสำหรับฟังก์ชั่นหรือไม่?
jpmc26

6

pg_catalogไม่แนะนำให้ติดตั้งส่วนขยายในเท่าที่ฉันทราบ คุณควรใช้publicสคีมาเริ่มต้นซึ่งอยู่ในsearch_pathค่าเริ่มต้นเช่นกัน

ทำไม?

ตัวอย่างเช่นฉันจะทำงานกับpageinspectส่วนขยายที่ฉันสร้างไว้แล้วภายในpublicสคีมา ฟังก์ชั่นทั้งหมดโดยค่าเริ่มต้นสามารถเข้าถึงสกีมาทั้งหมดในฐานข้อมูลได้หากอยู่ในpublicสคีมา

ตอนนี้ฉันลองย้ายไปที่pg_catalogสคีมาโดยใช้

ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;

และมันใช้งานได้ดี

แต่...

ลองย้ายอีกครั้งกลับไปที่publicสคีมาโดยใช้

ALTER EXTENSION pageinspect SET SCHEMA public;

และจะไม่อนุญาตให้ทำตามข้อผิดพลาดต่อไปนี้

ERROR: cannot remove dependency on schema pg_catalog because it is a system object
SQL state: 0A000

เอ่อโอ้! ก็ไม่เป็นไรที่ฉันจะไม่ย้าย ฉันสามารถเอามันกลับเข้าไปในpublicสคีมาได้โดยปล่อยและสร้างใหม่ใช่มั้ย ...

DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;

OK ดี. กลับมาอยู่ในตำแหน่งที่ถูกต้องในpublicสคีมาและยังสามารถเข้าถึงฟังก์ชั่นสกีมาทั้งหมดในฐานข้อมูลได้

TL, DR; เพียงใช้publicสคีมาเริ่มต้นสำหรับส่วนขยาย

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