Apakah jalur pencarian skema search_path
?
Panduan:
[...] tabel sering disebut dengan nama wajar tanpa pengecualian, yang hanya terdiri dari nama tabel. Sistem menentukan tabel mana yang dimaksud dengan mengikuti jalur penelusuran, yaitu daftar skema yang harus dilihat .
Penekanan saya yang berani. Ini menjelaskan resolusi pengenal .
“Skema saat ini” (atau “skema default”) adalah, per dokumentasi:
Skema pertama bernama di jalur penelusuran disebut skema saat ini . Selain sebagai skema pertama yang dicari, juga merupakan skema di mana tabel baru akan dibuat jika
CREATE TABLE
perintah tidak menentukan nama skema.
Penekanan saya yang berani. Skema sistem pg_temp
(skema untuk objek sementara dari sesi saat ini) dan pg_catalog
secara otomatis menjadi bagian dari jalur pencarian dan dicari pertama , dalam urutan ini. Panduan:
pg_catalog
selalu efektif menjadi bagian dari jalur pencarian. Jika tidak disebutkan namanya secara eksplisit di jalurnya maka secara implisit dicari sebelum mencari skema jalur. Ini memastikan bahwa nama bawaan akan selalu dapat ditemukan. Namun, Anda dapat secara eksplisit menempatkanpg_catalog
di akhir jalur pencarian Anda jika Anda lebih suka nama yang ditentukan pengguna menggantikan nama bawaan.
Penekanan tebal sesuai aslinya. Dan pg_temp
datang sebelum itu, kecuali jika ditempatkan pada posisi yang berbeda.
Bagaimana cara mengaturnya?
Ada berbagai cara untuk menyetel variabel runtime search_path
.
-
Tetapkan kluster -wide default untuk semua peran di semua database di
postgresql.conf
(dan memuat ulang). Hati-hati dengan itu!search_path = 'blarg,public'
Default yang dikirimkan untuk pengaturan ini adalah:
search_path = "$user",public
Elemen pertama menentukan bahwa skema dengan nama yang sama dengan pengguna saat ini akan dicari. Jika tidak ada skema seperti itu, entri akan diabaikan.
-
Tetapkan sebagai default untuk satu database :
ALTER DATABASE test SET search_path = blarg,public;
-
Tetapkan sebagai default untuk peran Anda terhubung dengan (efektif untuk seluruh cluster):
ALTER ROLE foo SET search_path = blarg,public;
-
Atau bahkan (seringkali terbaik!) sebagai default untuk peran dalam database :
ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
-
Tulis perintah di bagian atas skrip Anda. Atau jalankan di sesi DB Anda :
SET search_path = blarg,public;
-
Setel
search_path
specific tertentu untuk lingkup fungsi (agar aman dari pengguna jahat dengan hak istimewa yang memadai). Baca tentang MenulisSECURITY DEFINER
Berfungsi Aman di manual.
CREATE FUNCTION foo() RETURNS void AS
$func$
BEGIN
-- do stuff
END
$func$ LANGUAGE plpgsql SECURITY DEFINER
SET search_path=blarg,public,pg_temp;
Angka yang lebih tinggi dalam daftar saya mengalahkan angka yang lebih rendah.
Manual memiliki lebih banyak cara , seperti menyetel variabel lingkungan atau menggunakan opsi baris perintah.
Untuk melihat setelan saat ini:
SHOW search_path;
Untuk menyetel ulang:
RESET search_path;
Panduan:
Nilai default didefinisikan sebagai nilai yang akan dimiliki parameter, jika tidak ada
SET
pernah dikeluarkan untuk itu di sesi saat ini.