Apa itu search_path untuk basis data dan pengguna yang diberikan?

44

Saya bisa melihat arus search_pathdengan:

show search_path ;

Dan saya dapat mengatur search_pathuntuk sesi saat ini dengan:

set search_path = "$user", public, postgis;

Juga, saya dapat secara permanen mengatur search_pathuntuk database yang diberikan dengan:

alter database mydb set search_path = "$user", public, postgis ;

Dan saya dapat secara permanen mengatur peran yangsearch_path diberikan (pengguna) dengan:

alter role johnny set search_path = "$user", public, postgis ;

Tapi saya ingin tahu bagaimana menentukan basis data dan pengaturan peran (sehubungan dengan search_path) sebelum mengubahnya?

user664833
sumber

Jawaban:

36

Anda dapat menemukan pengaturan konfigurasi untuk peran dan database di tabel katalog pg_db_role_setting.

Kueri ini mengambil pengaturan apa pun untuk peran atau database yang diberikan:

SELECT r.rolname, d.datname, rs.setconfig
FROM   pg_db_role_setting rs
LEFT   JOIN pg_roles      r ON r.oid = rs.setrole
LEFT   JOIN pg_database   d ON d.oid = rs.setdatabase
WHERE  r.rolname = 'myrole' OR d.datname = 'mydb';

Jika tidak ada yang ditetapkan, instance bawah berikutnya menentukan status default search_path, yang postgresql.confdalam hal ini atau opsi baris perintah saat server mulai. Terkait:

Untuk unset setiap pengaturan peran atau database - yang search_pathdalam contoh khusus ini:

ALTER ROLE myrole RESET search_path;

Atau:

ALTER DATABASE mydb RESET search_path;

Atau:

ALTER ROLE myrole in DATABASE mydb RESET search_path;

Jangan pernah memanipulasi data dalam katalog sistem ( pg_catalog.*) secara manual. Gunakan perintah DDL seperti yang diperintahkan dalam manual untuk ALTER ROLEdan ALTER DATABASE.
Pada dasarnya, RESETperintah ini menghapus satu baris dari pg_db_role_settingmembiarkan pengaturan dasar berlaku lagi. Saya tidak akan menyebutnya berbelit-belit.

Erwin Brandstetter
sumber
Wow. Saya tidak membayangkan ini akan berbelit-belit. Bagaimana Anda menghapus pengaturan basis data dan peran yang diberikan ? Setelah mengeksekusi alter role myrole set search_path = "$user", public, postgis ;saya perhatikan bahwa pg_roles.rolconfig(sesuai dengan peran saya) mendapat nilai {"search_path=\"$user\", public, postgis"}. Juga, select * from pg_db_role_setting ;sekarang menunjukkan baris tambahan. Dan setelah mengeksekusi alter database mydb set search_path = "$user", public, postgis ;saya melihat baris yang sesuai di select * from pg_db_role_setting ;- pada akhirnya, saya tidak yakin bagaimana "membatalkan" perubahan ini.
user664833
@ user664833: Saya menambahkan instruksi untuk tidak disetel.
Erwin Brandstetter
6

Pengaturan permanen untuk database dan peran disimpan di tabel sistem cluster-lebar pg_db_role_settings .

Hanya pengaturan yang diubah yang ada. Jika jalur pencarian tidak pernah dimodifikasi untuk database atau peran, saya kira itu bisa diasumsikan "$user",public.

  • Nilai pengaturan sebelum perubahan apa pun, termasuk di tingkat klaster (melalui konfigurasi global postgresql.conf) dapat ditanyakan dari database dengan:

     SELECT boot_val FROM pg_settings WHERE name='search_path';
  • Nilai pengaturan sebelum perubahan dalam sesi (melalui SETperintah) dapat ditanyakan dari database dengan:

     SELECT reset_val FROM pg_settings WHERE name='search_path';
  • Ketika menetapkan nilai non-default postgresql.conf, tidak mudah untuk mendapatkan nilai itu dalam SQL secara independen dari sesi saat ini . pg_settings.boot_valtidak akan melakukannya karena mengabaikan perubahan dalam file konfigurasi, dan pg_settings.reset_valjuga tidak, karena dipengaruhi oleh pengaturan basis data / pengguna yang berpotensi diatur ALTER USER/ALTER DATABASE. Cara paling sederhana untuk DBA untuk mendapatkan nilai adalah dengan mencarinya saja postgresql.conf. Jika tidak, lihat Reset pencarian_path ke global, default cluster yang mencakup topik ini secara detail.

Daniel Vérité
sumber
Bukankah boot_valsebenarnya bawaan pabrik yang dikompilasi, bukan pengaturan di postgresql.conf?
Erwin Brandstetter
@ Erwin: ya. Orang mungkin ingin melihat reset_valbukan boot_val.
Daniel Vérité
Hmm, basis data atau pengaturan peran menimpa nilai dalam reset_val. Saya menemukan pertanyaan lama ini meneliti yang baru-baru ini: dba.stackexchange.com/questions/145280/…
Erwin Brandstetter
@ Erwin: ISTM yang mendapatkan nilai dari postgresql.conf cenderung menjadi masalah XY dalam banyak kasus. Lagi pula, saya mengedit jawaban untuk menautkan ke pertanyaan yang lebih baru dan memperluas sedikit.
Daniel Vérité
3
select * from pg_user;

Benar untuk postgres dan Redshift. Ini kelihatannya terlalu sederhana dibandingkan dengan jawaban sebelumnya yang bergantung pada pg_db_role_setting, tetapi useconfigkolom akan memiliki daftar konfigurasi pengguna termasuk search_path, diformat sebagai daftar.

pg_user Dokumentasi Postgres ada di sini

Untuk lebih selektif:

rs.db.batarang.com cooldb:cooldude =#> select usename
                                              , useconfig 
                                       from   pg_user
                                       where  usename = 'cooldude';
┌────────────┬─────────────────────────────────────────────────────┐
  usename                         useconfig                      
├────────────┼─────────────────────────────────────────────────────┤
 cooldude    {"search_path=dirt, test, \"$user\", public, prod"} 
└────────────┴─────────────────────────────────────────────────────┘

Saya pikir tabel pengguna ini berisi semua pengguna di cluster, bukan hanya db spesifik - tapi saya tidak memverifikasi itu.

Merlin
sumber
Peran tidak persis sama dengan pengguna. ;)
Vic
Vic, bisakah Anda menguraikannya? Dokumen Postgres ringkas dan sepertinya mengatakan bahwa pengguna dan peran bukan lagi konsep yang berbeda, tetapi saya bukan seorang DBA dan akan sangat menyukai masukan. postgresql.org/docs/current/static/user-manag.html
Merlin
2
'Peran' apa pun dapat bertindak sebagai pengguna, grup, atau keduanya. Tetapi pengguna 'tersirat memiliki satu perbedaan lain. Meninjau katalog kita melihat bahwa pandangan pg_role dan pg_user kedua tabel referensi pg_authid, tetapi dengan predikat rolcanlogin untuk pengguna. 'Pengguna' dapat masuk ke database Anda dan umumnya 'peran' menentukan set otorisasi yang diwarisi pengguna.
Vic