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.