Belirli bir veritabanı ve kullanıcı için search_path nedir?


43

Akımı search_pathşununla görebiliyorum :

show search_path ;

Ve ayarlayabilirsiniz search_pathiçin geçerli oturum ile:

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

Ayrıca, search_pathverilen bir veritabanı için kalıcı olarak şunları ayarlayabilirim :

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

Ve search_pathbelirli bir rol için (kullanıcı) kalıcı olarak şunları ayarlayabilirim :

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

Fakat veri tabanının ve rol ayarlarının search_pathdeğiştirilmeden önce ( bunlara göre ) ne olduğunu nasıl belirleyeceğimi bilmek istiyorum.

Yanıtlar:


36

Rol ve veritabanlarının yapılandırma ayarlarını katalog tablosunda bulabilirsiniz pg_db_role_setting.

Bu sorgu, belirli bir rol veya veritabanı için herhangi bir ayarı alır:

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';

Hiçbir şey ayarlanmadıysa, bir sonraki alt örnek , bu durumda search_patholan varsayılan durumunu postgresql.confveya sunucu başlangıcındaki komut satırı seçeneklerini belirler. İlgili:

To unset herhangi bir rol veya veritabanının ayarlarını - search_pathBu özel örnekte:

ALTER ROLE myrole RESET search_path;

Veya:

ALTER DATABASE mydb RESET search_path;

Veya:

ALTER ROLE myrole in DATABASE mydb RESET search_path;

Sistem kataloğundaki ( pg_catalog.*) verileri asla el ile değiştirmeyin. İçin manuel anlatıldığı gibi kullanın DDL komutları ALTER ROLEve ALTER DATABASE.
Temel olarak, RESETkomut pg_db_role_setting, temel ayarın tekrar etkili olmasını sağlamak için bir satırı siler . Buna sarsılmış demem.


Vay. Bu kadar sarsılmış olacağını düşünmedim. Nasıl olur unset belirli bir veritabanı ve rol ayarı? Yürüttükten sonra alter role myrole set search_path = "$user", public, postgis ;onu farkettim pg_roles.rolconfig(benim rolüne karşılık gelen) değer var {"search_path=\"$user\", public, postgis"}. Ayrıca, select * from pg_db_role_setting ;şimdi ek bir satır gösterir. Ve çalıştırdıktan sonra sonunda alter database mydb set search_path = "$user", public, postgis ;ilgili bir satır görüyorum select * from pg_db_role_setting ;, bu değişikliklerin nasıl "geri alınacağından" emin değilim.
user664833

@ user664833: Çözmek için talimatlar ekledim.
Erwin Brandstetter

6

Hem veritabanları hem de roller için kalıcı ayarlar pg_db_role_settings sistem kümesi tablosunda saklanır .

Sadece değiştirilmiş ayarlar var. Arama yolu bir veritabanı veya rol için hiçbir zaman değiştirilmediyse, sanırım bunun olduğu varsayılabilir "$user",public.

  • Küme düzeyinde de dahil olmak üzere herhangi bir değişiklikten önceki ayarın değeri (genel yapılandırma aracılığıyla postgresql.conf) veritabanından şu şekilde sorgulanabilir:

     SELECT boot_val FROM pg_settings WHERE name='search_path';
  • Oturumdaki herhangi bir değişiklikten önceki ayarın değeri ( SETkomut aracılığıyla ) veritabanından şu şekilde sorgulanabilir:

     SELECT reset_val FROM pg_settings WHERE name='search_path';
  • Varsayılan olmayan bir değere ayarlandığında postgresql.conf, bu değeri SQL'den geçerli oturumdan bağımsız olarak elde etmek kolay değildir . pg_settings.boot_valKonfigürasyon dosyasındaki değişiklikleri göz ardı ettiği için yapmayacak ve pg_settings.reset_valpotansiyel olarak ayarlanan veritabanı / kullanıcı ayarlarından etkileneceği için her ikisi de olmayacak ALTER USER/ALTER DATABASE. Bir DBA'nın değeri almasının en basit yolu, sadece onu aramaktır postgresql.conf. Aksi halde, bkz. Search_path'i, bu konuyu detaylı olarak kapsayan genel, küme varsayılanına sıfırlama .


Değil mi boot_valaslında derlenmiş-fabrika varsayılan değil ayar postgresql.conf?
Erwin Brandstetter

@Erwin: evet. Biri reset_valyerine bakmak isteyebilir boot_val.
Daniel Vérité

Hmm, veritabanı veya rol ayarları, içindeki değerin üzerine yazılır reset_val. Bu son soruyu araştırırken bu eski soruya rastladım: dba.stackexchange.com/questions/145280/…
Erwin Brandstetter

@Erwin: ISTM postgresql.conf dosyasından değer almanın çoğu durumda bir XY problemi olması muhtemeldir. Her neyse, cevabı yeni soruya bağlamak ve biraz genişletmek için düzenlemiştim.
Daniel Vérité

3
select * from pg_user;

Postgres ve Redshift için geçerlidir. Bu, bağlı olan önceki yanıtlara kıyasla çok basit görünüyor pg_db_role_setting, ancak useconfigsütun, liste halinde search_pathbiçimlendirilmiş de dahil olmak üzere kullanıcı yapılandırmalarının bir listesine sahip olacak.

pg_user Postgres belgeleri burada

Daha seçici olmak için:

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"} 
└────────────┴─────────────────────────────────────────────────────┘

Bu kullanıcı tablosunun kümedeki tüm kullanıcıları içerdiğini düşünüyorum, yalnızca belirli db'leri değil - bunu doğrulamadım.


Rol, kullanıcı ile tamamen aynı değildir. ;)
Vic,

Vic, detaylandırır mısın? Postgres dokümanı özlüdür ve kullanıcı ve rolün artık ayrı kavramlar olmadığı söylenebilir, ancak ben bir DBA değilim ve daha fazla girdi isterim. postgresql.org/docs/current/static/user-manag.html
Merlin

2
Herhangi bir 'rol' bir kullanıcı, bir grup veya her ikisi gibi davranabilir. Ancak bir kullanıcının bir başka ayrımı olduğu ima edilir. Kataloğu inceleyerek pg_role ve pg_user görünümlerinin her ikisinin de pg_authid referans tablosunu gösterdiğini, ancak kullanıcılar için belirleyici rolcanlogin olduğunu görüyoruz. 'Kullanıcılar' veritabanınıza giriş yapabilir ve genellikle 'roller', kullanıcıların devraldığı yetki gruplarını tanımlar.
Vic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.