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;
WHEREKapsamı 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 GRANTetmek deyimi -cseç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 %Ibiç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_namespacebulunabilir pg_catalogşema. Oradaki diğer nesnelere göz atın - şemalarınızın, tablolarınızın vb.
grant usageYeni ş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 .