Jawaban:
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:
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
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 menggunakan public
skema default , yang juga ada dalam search_path
default.
Sebagai contoh, saya akan bekerja dengan pageinspect
ekstensi yang sudah saya buat dalam public
skema. Semua fungsi, secara default, dapat diakses oleh semua skema dalam database jika mereka berada di public
skema.
Sekarang, saya mencoba memindahkannya ke pg_catalog
skema, menggunakan
ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;
dan itu berfungsi dengan baik.
Tapi...
Coba pindahkan lagi, kembali ke public
skema menggunakan
ALTER EXTENSION pageinspect SET SCHEMA public;
dan itu tidak akan mengizinkannya, menghasilkan kesalahan berikut
ERROR: cannot remove dependency on schema pg_catalog because it is a system object
SQL state: 0A000
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? ...
DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;
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.
plpgsql
ekstensi kemudian entah bagaimana pengecualian untuk aturan ini? Setiap instalasi yang saya lihat memiliki ekstensi ini di pg_catalog