Apakah disarankan untuk menginstal ekstensi ke skema pg_catalog?

Jawaban:

16

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 EXTENSIONtidak 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_pathuntuk 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 extensionsskema di belakang objek dengan nama yang sama (dan parameter) dalam publicskema.

Terkait:

Erwin Brandstetter
sumber
ok plpgsqlekstensi kemudian entah bagaimana pengecualian untuk aturan ini? Setiap instalasi yang saya lihat memiliki ekstensi ini di pg_catalog
zam6ak
@ zam6ak: Ya, plpgsql adalah sedikit kasus khusus: Mengutip manual :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 menginstal sendiri pg_catalogjuga. (Ini melempar kesalahan jika Anda mencoba mengubahnya.) Apakah ini mungkin standar untuk menginstal ekstensi bahasa prosedural untuk fungsi?
jpmc26
6

Memasang ekstensi ke pg_catalog, sejauh yang saya ketahui, tidak disarankan. Anda harus menggunakan publicskema default , yang juga ada dalam search_pathdefault.

Mengapa?

Sebagai contoh, saya akan bekerja dengan pageinspectekstensi yang sudah saya buat dalam publicskema. Semua fungsi, secara default, dapat diakses oleh semua skema dalam database jika mereka berada di publicskema.

Sekarang, saya mencoba memindahkannya ke pg_catalogskema, menggunakan

ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;

dan itu berfungsi dengan baik.

Tapi...

Coba pindahkan lagi, kembali ke publicskema 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 publicskema dengan menjatuhkannya dan menciptakan kembali, kan? ...

DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;

Oke bagus. Kembali ke tempat yang tepat dalam publicskema, dan fungsinya masih dapat diakses oleh semua skema dalam database.

TL, DR; Cukup gunakan publicskema default untuk ekstensi.

Chris
sumber