En az iki seçeneğiniz var.
İlki küçük bir sorgu ve bir metin editörü kullanır. İlgi alanımızın şemasını toplamalıyız:
SELECT nspname
FROM pg_namespace;
WHERE
Kapsamı sınırlamak istiyorsanız bir cümle ekleyebilirsiniz . Çıktıyı kopyalayın ve değiştirin, böylece bir dizi GRANT USAGE ON SCHEMA ... TO your_role;
komut alırsınız . Sonra sadece aşağıdaki gibi besleyin psql
:
psql -f multigrant.sql
Bunun bir olağan varyantı toplanan isim ve görüşmeleri üzerinden döngüler bir kabuk komut dosyası olabilir psql
, inşa geçen GRANT
etmek deyimi -c
seçeneği.
Diğer çözüm temel olarak bir pl / pgsql bloğunda aynı şeyi yaparak dinamik bir sorgu oluşturur. Çekirdek aynı - şemayı toplamalıyız. Ardından, şema ile izin şemasını vererek hepsinin üzerinden geçiyoruz:
DO $do$
DECLARE
sch text;
BEGIN
FOR sch IN SELECT nspname FROM pg_namespace
LOOP
EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
END LOOP;
END;
$do$;
Notlar :
- tablolar, sıralar, işlevler ve türlerin aksine şemalar için varsayılan ayrıcalıklar ayarlanamaz (9.4'ten itibaren). Yeni eklenen herhangi bir şema için bu ayrıcalığı manuel olarak vermeniz gerekecektir.
- burada dinamik sorgu oluştururken dolar tırnak kullanıyorum . Bu, örneğin tek tırnakları çoğaltmanın aksine 'normal' sözdizimini kullanmama izin veriyor (bu örnekte mevcut değil). Bu şekilde çoğu editör ifadeleri güzelce vurgulayacaktır.
- Ayrıca nesne adı düzgün gerekirse alıntı
format()
için %I
biçim belirleyicisi ile kullanın . Bu yaklaşım, dizeyi sabitleri ve bazı quote_ident()
çağrıları birleştirerek sorguyu oluşturmaktan çok daha okunabilir .
pg_namespace
bulunabilir pg_catalog
şema. Oradaki diğer nesnelere göz atın - şemalarınızın, tablolarınızın vb.
grant usage
Yeni şema için otomatik olarak çalışan bir olay tetikleyicisi kullanarak yeni oluşturulan şemalar için varsayılan ayrıcalıkları simüle edip edemeyeceğinizi merak ediyorum .