Karena objek dalam pg_catalog
skema secara implisit dalam search_path
( docs ), apakah akan disarankan untuk menginstal ekstensi dalam skema itu?
Karena objek dalam pg_catalog
skema secara implisit dalam search_path
( docs ), apakah akan disarankan untuk menginstal ekstensi dalam skema itu?
Tidak menginstal ekstensi untuk pg_catalog
(kecuali yang default: sangat sedikit ekstensi dirancang seperti itu), karena Anda tidak main-main dengan sistem katalog, pernah . @ Chris menunjukkan satu alasan mengapa. Ada yang lain.
Namun, skema "publik" sama sekali tidak istimewa . Hanya skema default yang sudah diinstal sebelumnya dalam distribusi standar sehingga kami dapat segera mulai. Beberapa admin DB sama sekali tidak menggunakan skema "publik", beberapa bahkan menghapusnya.
CREATE EXTENSION
tidak berafiliasi dengan skema "publik". Itu menginstal ke skema saat ini kecuali diperintahkan sebaliknya - kecuali beberapa ekstensi memiliki skema yang telah ditetapkan (seperti PGQ / Londiste ). Dokumentasi:
schema_name
Nama skema tempat memasang objek ekstensi, mengingat ekstensi memungkinkan kontennya dipindahkan. Skema bernama harus sudah ada. Jika tidak ditentukan, dan file kontrol ekstensi tidak menentukan skema, skema pembuatan objek default saat ini digunakan .
Ingatlah bahwa ekstensi itu sendiri tidak dianggap berada dalam skema apa pun: ekstensi memiliki nama yang tidak memenuhi syarat yang harus unik di seluruh basis data. Tetapi objek yang dimiliki ekstensi dapat berada dalam skema.
Penekanan berani saya.
Putuskan bagaimana mengelola pengguna, skema, dan search_path
:
Kemudian tentukan di mana menginstal ekstensi. Anda dapat menginstal ke skema apa pun pilihan Anda dan memasukkan skema itu di default search_path
untuk semua pengguna atau hanya untuk beberapa atau tidak ada pengguna sama sekali (sehingga diperlukan referensi yang memenuhi syarat). Itu semua tergantung pada apa yang ingin Anda capai.
Apa pun yang Anda lakukan, tetaplah konsisten.
Saya suka memasang ekstensi (yang memungkinkannya) dalam skema "ekstensi" khusus, yang saya sertakan di default search_path
setelah "publik" (dan "$ user" - jika Anda menggunakannya). Membantu dengan pemisahan yang bersih dari fungsi publik saya sendiri dan objek publik lainnya. Pengaturan saya di postgresql.conf
:
search_path = "$user",public,extensions
Atau:
search_path = public,extensions
Dan saya menginstal ekstensi dengan:
CREATE EXTENSION some_extension SCHEMA extensions;
Satu hal yang perlu diperhatikan: Dengan cara ini Anda dapat "menyembunyikan" objek (tidak memenuhi syarat) dalam extensions
skema di belakang objek dengan nama yang sama (dan parameter) dalam public
skema.
Terkait:
plpgsql
ekstensi kemudian entah bagaimana pengecualian untuk aturan ini? Setiap instalasi yang saya lihat memiliki ekstensi ini di pg_catalogIn 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
juga. (Ini melempar kesalahan jika Anda mencoba mengubahnya.) Apakah ini mungkin standar untuk menginstal ekstensi bahasa prosedural untuk fungsi?Memasang ekstensi ke
pg_catalog
, sejauh yang saya ketahui, tidak disarankan. Anda harus menggunakanpublic
skema default , yang juga ada dalamsearch_path
default.Mengapa?
Sebagai contoh, saya akan bekerja dengan
pageinspect
ekstensi yang sudah saya buat dalampublic
skema. Semua fungsi, secara default, dapat diakses oleh semua skema dalam database jika mereka berada dipublic
skema.Sekarang, saya mencoba memindahkannya ke
pg_catalog
skema, menggunakandan itu berfungsi dengan baik.
Tapi...
Coba pindahkan lagi, kembali ke
public
skema menggunakandan itu tidak akan mengizinkannya, menghasilkan kesalahan berikut
Uh oh! Yah, tidak apa-apa kalau itu tidak membiarkan saya memindahkannya. Saya bisa mendapatkannya kembali ke
public
skema dengan menjatuhkannya dan menciptakan kembali, kan? ...Oke bagus. Kembali ke tempat yang tepat dalam
public
skema, dan fungsinya masih dapat diakses oleh semua skema dalam database.TL, DR; Cukup gunakan
public
skema default untuk ekstensi.sumber