DB'deki bir kullanıcıya tüm izinleri verme


206

Bir kullanıcıya yönetici yapmadan veritabanındaki tüm izinleri vermek istiyorum. Bunu yapmak istiyorum nedeni şu anda DEV ve PROD aynı kümede farklı DBs olmasıdır, bu yüzden bir kullanıcının üretim nesnelerini değiştirmek istemiyorum ama DEV üzerindeki nesneleri değiştirmek gerekir.

Denedim:

grant ALL on database MY_DB to group MY_GROUP;

ancak herhangi bir izin vermiyor gibi görünüyor.

Sonra denedim:

grant all privileges on schema MY_SCHEMA to group MY_GROUP;

ve bana nesne oluşturma izni veriyor gibi görünüyor, ancak bu şemadaki diğer kullanıcılara ait nesneleri sorgulama \ silme

Kullanıcıya MY_SCHEMA üzerinde KULLANIM izni vererek devam edebilirdim ama sonra masaya izin vermemekten şikayetçi olurdum ...

Sanırım sorum şu: Bir kullanıcıya bir DB üzerindeki tüm izinleri vermenin kolay bir yolu var mı?

PostgreSQL 8.1.23 üzerinde çalışıyorum.

Yanıtlar:


271

Kullanıcının veritabanına erişmesi gerektiği açıktır:

GRANT CONNECT ON DATABASE my_db TO my_user;

Ve (en azından) şemadakiUSAGE ayrıcalık :

GRANT USAGE ON SCHEMA public TO my_user;

Ya hibe USAGEüzerinde tüm özel şemalar:

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

Ardından, tüm tablolar için tüm izinler (Postgres 9.0 veya üstünü gerektirir ).
Ve dizileri (varsa) unutmayın :

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

Daha eski sürümler için pgAdmin III'ün (varsayılan GUI) "Hibe Sihirbazı" nı kullanabilirsiniz.

Başka nesneler de var , el kitabıGRANT Postgres 12'den itibaren tam listeye sahip:

veritabanı nesnesindeki ayrıcalıklar (tablo, sütun, görünüm, yabancı tablo, sıra, veritabanı, yabancı veri sarmalayıcı, yabancı sunucu, işlev, yordam, yordamsal dil, şema veya tablo alanı)

Ancak geri kalanlara nadiren ihtiyaç duyulur. Daha fazla detay:

Mevcut bir sürüme yükseltme yapmayı düşünün .


133
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;

24
Tüm ayrıcalıkları vermek ON DATABASEkulağa güçlü geliyor, ama pek bir şey yapmıyor. Bu sadece bir başlangıç. İçerdiği nesneler üzerinde herhangi bir ayrıcalık tanımaz.
Erwin Brandstetter

50

PostgreSQL 9.0 ve sonraki sürümlerinde aşağıdakileri yaparsınız:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP;

Bunu yeni oluşturulan ilişkiler için de etkinleştirmek istiyorsanız, varsayılan izinleri ayarlayın:

ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP;
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP;

Ancak, 8.1 kullandığınızı görünce kendiniz kodlamanız gerekir:

CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS integer AS $$
DECLARE
  rel RECORD;
BEGIN
  FOR rel IN
    SELECT c.relname
    FROM pg_class c
    JOIN pg_namespace s ON c.namespace = s.oid
    WHERE s.nspname = schname
  LOOP
    EXECUTE 'GRANT ALL PRIVILEGES ON ' || quote_ident(schname) || '.' || rel.relname || ' TO ' || quote_ident(grant_to);
  END LOOP;
  RETURN 1;
END; $$ LANGUAGE plpgsql STRICT;
REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC;

Bu, tüm ilişkilerin ayrıcalıklarını ayarlayacaktır: tablolar, görünümler, dizinler, sıralar, vb. Bunu kısıtlamak istiyorsanız, filtreleyin pg_class.relkind. Ayrıntılar için pg_class belgelerine bakın.

Bu işlevi süper kullanıcı olarak ve uygulamanızın gerektirdiği kadar düzenli olarak çalıştırmalısınız. Bir seçenek, bunu her gün veya her saat yürüten bir cron işinde paketlemek olacaktır.


Merhaba Patrick, "TÜM TABLOLAR" 8.1 ( postgresql.org/docs/8.1/static/sql-grant.html ) ' de mevcut değildir . Tablolar arasında dolaşıp izinleri ayrı ayrı verebileceğimi biliyorum. kaçınmaya çalışıyor. ama yardımın için teşekkürler
Diego

@Diego: 8.1 için çözüm eklendi
Patrick

teşekkürler patrick, ben senin gibi bir şey kullanarak sona erdi ama "HİBE ALL" kullanarak. Nedense hiçbir şey yapmıyor gibi görünüyor. Exampe için koştum: userA'ya şema testinde ALL ver; ancak bundan sonra userA hala şema testindeki tablolardan okuma erişimine sahip değil
Diego

2
Şemada KULLANIM VERMELİSİNİZ. Daha sonra bu şemadaki tüm ilişkilerde (tablolar, görünümler, diziler, dizinler, vb.) Ayrı ayrı SEÇMEK, EKLEME, GÜNCELLEME, SİLME, TRUNCATE ayırmanız gerekir. Şemalar ad alanlarıdır, ilişkiler verilerinizin bulunduğu yerdir.
Patrick

28

PostgreSQL 9.4.15 veritabanında 'eSumit' rolü eklemek ve bu role tüm izinleri vermek için aşağıdakileri yaptım:

CREATE ROLE eSumit;

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO eSumit;

GRANT ALL PRIVILEGES ON DATABASE "postgres" to eSumit;

ALTER USER eSumit WITH SUPERUSER;

Ayrıca pg_table girişlerini şu yolla kontrol ettiler:

pg_roles'dan * seçin; resim açıklamasını buraya girin

Veritabanı sorguları anlık görüntüsü: resim açıklamasını buraya girin


Postgres sürüm 10.3 var ve veritabanı adı etrafında tırnak kullandığınızda bir sözdizimi hatası atar.
sajid
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.