เนื่องจากวัตถุในpg_catalog
สคีมามีความหมายโดยนัยในsearch_path
( เอกสาร ) จะแนะนำให้ติดตั้งส่วนขยายในสคีมานั้นหรือไม่
เนื่องจากวัตถุในpg_catalog
สคีมามีความหมายโดยนัยในsearch_path
( เอกสาร ) จะแนะนำให้ติดตั้งส่วนขยายในสคีมานั้นหรือไม่
คำตอบ:
ไม่ได้ติดตั้งส่วนขยาย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
สคีมา
ที่เกี่ยวข้อง:
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.
pg_catalog
เช่นกัน (มันจะพ่นข้อผิดพลาดถ้าคุณพยายามที่จะเปลี่ยนมัน) นี่อาจเป็นมาตรฐานสำหรับการติดตั้งส่วนขยายภาษาขั้นตอนสำหรับฟังก์ชั่นหรือไม่?
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
สคีมาเริ่มต้นสำหรับส่วนขยาย
plpgsql
ส่วนขยายแล้วอย่างใดข้อยกเว้นกฎนี้ ทุกการติดตั้งที่ฉันได้เห็นมีส่วนขยายนี้ใน pg_catalog