Postgresql: VERİTABANI'NDAKİ BÜYÜK TÜM PRIVILEGES ne yapar?


60

Belirli bir veritabanındaki tüm tablolardaki tüm ayrıcalıkları yeni bir postgres kullanıcısına (sahibine değil) vermeye çalışıyorum. Öyle görünmüyor gibi görünüyor GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;. Adı geçen komutu başarıyla çalıştırdıktan sonra (postgres kullanıcısı olarak), aşağıdakileri new_user olarak alıyorum:

$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR:  permission denied for relation a_table_in_my_db

İki soru:

1) o zaman, my_db'deki tüm tablolara izin verilmezse, yukarıdaki komut ne işe yarar?

2) Tüm masalardaki tüm izinleri kullanıcıya vermek için doğru yol nedir? (gelecekte oluşturulan tüm tablolarda dahil)

Yanıtlar:


80

Sorularınızın cevapları online PostgreSQL 8.4 dokümanlarından geliyor .

  1. GRANT ALL PRIVILEGES ON DATABASEverir CREATE, CONNECTve TEMPORARYRole bir veritabanı üzerinde ayrıcalıkları (kullanıcılar düzgün olarak anılacaktır roller ). Bu ayrıcalıkların hiçbiri aslında bir tablodan veri okumak için bir role izin vermez; SELECTBunun için masada ayrıcalık gereklidir.

  2. Tüm tablolardaki tüm ayrıcalıkları bir role vermenin "uygun" bir yolu olduğundan emin değilim. Belirli bir rol sağlamanın en iyi yolu, bir tablodaki tüm ayrıcalıkları rol sağlamaktır sahiptir sahibi tabloyu. Varsayılan olarak, yeni oluşturulan her nesne, onu oluşturan role aittir, bu nedenle bir rolün bir tabloda tüm ayrıcalıklara sahip olmasını istiyorsanız, bu rolü oluşturmak için kullanın.

    PostgreSQL 9.0, neredeyse istediğiniz gibi olan aşağıdaki sözdizimini sunar :

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

    Sürtünme şemalarda varsayılan "genel" şema dışında tablolar oluşturuyorsanız, bu GRANTonlar için geçerli olmayacaktır. Genel olmayan şemaları kullanıyorsanız, GRANTbu şemaların ayrıcalıklarına ayrı ayrı sahip olmanız gerekir .


1
bir veritabanı birden fazla sahibine sahip olabilir mi? öyleyse, başka bir sahibi nasıl ekleyebilirim?
rz.

hayır Bir veritabanının birden fazla sahibi olabileceğini sanmıyorum, ancak bir sahibinin tüm yazılarını yine de verebilirsin
hellomynameisjoel

15
dizilerde aynı şeyi yapmanız gerektiğini unutmayın: GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user;ya da herhangi bir kayıt ekleyemezsiniz.

İşe yaramasa bile, şunu deneyin: = SCHEMA halkındaki TÜM TABLOLARDA TÜM ÖZEL ÖZELLİKLER your_user;
Kaustubh

10

Veritabanı sahibi olarak çalışmak için birden fazla giriş yapmak mümkündür:

  • Sahip olarak hareket etmek için bir "nologin" rolü oluşturun: create role dbowner nologin
  • Veritabanınızın sahibini şu şekilde değiştirin: alter database mydb owner dbowner
  • Tüm girişlerinizi bu yeni role verin: grant dbowner to user1, user2

Şimdi, user1 veya user2 login olursa, gerekli izinler olmadan "mydb" üzerindeki tüm izinlere sahip olurlar.

Ancak, bu çözümü dikkatle değerlendiririm. Şema güncellendiğinde ilave hibe yaratma sıkıntısını önlemek için web uygulamanızın bu girişlerden birini kullanması caziptir, ancak bu şekilde çok yararlı bir koruma biçimi kaldırıyorsunuz. Gerçekten birden çok "yönetici" istiyorsanız, yukarıdaki çözümü kullanın, ancak "normal kullanım" uygulamanız için giriş yapmak için yukarıdaki "şemadaki tüm tablolara tüm ayrıcalıkları ver ..." şablonunu uygulayın.


1
Chris Cogdon, sadece küçük bir düzeltme: veritabanı Mydb sahibini değiştirmek için dbowner
user876743
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.