Veritabanındaki tüm şemalarda KULLANIM VERİLİR Mİ?


13

GRANT USAGEBelirli bir veritabanı için bir kullanıcı / rol istiyorum . Veritabanı birçok şemaya sahiptir.

Bir tane olduğunu biliyorum ON ALL TABLES IN SCHEMA, ama "tüm şemaları" istiyorum. Denedim GRANT USAGE .. ON DATABASE, ama bu açıkça yanlış (aslında yok ).

Bu Postgres 9.3 veya 9.4 içindir, AWS RDS'de bulunan bir sunucu olur.

Yanıtlar:


18

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.

1
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 .
a_horse_with_no_name

@a_horse_with_no_name bunu düşünüyor, şu anda bunun yapılamamasının bir nedeni göremiyorum.
dezso

0

Siz de kullanabilirsiniz.

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace where nspname != 'pg_toast' 
    and nspname != 'pg_temp_1' and nspname != 'pg_toast_temp_1'
    and nspname != 'pg_statistic' and nspname != 'pg_catalog'
    and nspname != 'information_schema'
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I to your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL SEQUENCES IN SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL TABLES IN SCHEMA %I TO backup_user $$, sch);

        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON TABLES TO your_role $$, sch);
        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON SEQUENCES TO your_role $$, sch);
    END LOOP;
END;
$do$;
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.