PostgreSQL'deki bir grup rolüne veritabanındaki belirli bir şema üzerinde tümünü atayın


96

PostgreSQL 9.0'ı kullanarak, "personel" adında bir grup rolüm var ve belirli bir şemadaki tablolarda bu role tüm (veya belirli) ayrıcalıkları vermek istiyorum. Aşağıdaki çalışmalardan hiçbiri

GRANT ALL ON SCHEMA foo TO staff;
GRANT ALL ON DATABASE mydb TO staff;

"Personel" üyeleri, "foo" şemasındaki tek tek tablolarda veya (ikinci komut durumunda) veritabanındaki herhangi bir tabloya , o belirli tabloda tümünü vermediğim sürece , SEÇME veya GÜNCELLEME yapamaz .

Benim ve kullanıcılarımın hayatını kolaylaştıracak ne yapabilirim?

Güncelleme: Bunu serverfault.com'daki benzer bir soru yardımıyla çözdüm .

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;

Yanıtlar:


126

Verilen şemadaki tüm mevcut tablolar için ayrıcalıklar belirleyen kısayolu buldunuz . Kılavuz açıklığa kavuşturur :

(ancak bunun görünümleri ve yabancı tablolarıALL TABLES içerdiği kabul edildiğini unutmayın ).

Cesur vurgu benim. serialsütunlar, nextval()sütun varsayılanı olarak bir sıra üzerinde uygulanır ve kılavuzu alıntı yaparak :

Diziler için bu ayrıcalık currvalve nextvalişlevlerinin kullanımına izin verir .

Dolayısıyla, serialsütunlar varsa , dizilere deUSAGE (veya ALL PRIVILEGES) vermek isteyeceksiniz.

GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;

Not: Postgres 10 veya sonraki sürümlerdeki kimlik sütunları , ek ayrıcalıklar gerektirmeyen örtük diziler kullanır. ( serialSütunları yükseltmeyi düşünün .)

Peki ya yeni nesneler?

DEFAULT PRIVILEGESKullanıcılar veya şemalar için de ilgileneceksiniz :

ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT USAGE          ON SEQUENCES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo REVOKE ...;

Bu, gelecekte otomatik olarak oluşturulan nesneler için ayrıcalıkları ayarlar - ancak önceden var olan nesneler için geçerli değildir.

Varsayılan ayrıcalıklar yalnızca hedeflenen kullanıcı ( FOR ROLE my_creating_role) tarafından oluşturulan nesnelere uygulanır . Bu cümle atlanırsa, varsayılan olarak mevcut kullanıcı yürütülür ALTER DEFAULT PRIVILEGES. Açık olmak gerekirse:

ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo GRANT ...;
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo REVOKE ...;

Ayrıca, pgAdmin III'ün tüm sürümlerinin ince bir hataya sahip olduğunu ve mevcut rol için geçerli olmasalar bile SQL bölmesinde varsayılan ayrıcalıkları görüntülediğini unutmayın. FOR ROLESQL komut dosyasını kopyalarken yan tümceyi manuel olarak ayarladığınızdan emin olun .


2
Erwin'i tanıyorsun diye, tavsiyeni gönderdikten 10 dakika sonra, buna ihtiyacım vardı. Sanki ne yapacağımı biliyormuşsunuz ... yeni bir masa yaratın ve doğru ayrıcalıklara sahip olmadığını anlayın. Cevabınız kurtarmaya geldi.
punkish


Çalıştırırken ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;hangi veritabanını nasıl bilebilir? SCHEMA foofarklı bir veritabanında var olabilir mi?
J86

2
@ J86: yalnızca mevcut veri tabanı için geçerlidir - komutun yürütüldüğü yerde.
Erwin Brandstetter

1
@ErwinBrandstetter Gelecekteki tablolar / diziler için app_user'a (okuma-yazma), tabloların başka bir adanmış migration_user tarafından otomatik olarak oluşturulması şartıyla (uçuş geçişleri uygulama başlangıcında çalıştırılır ) erişim izni verebilir miyim ?
lexeme

45

Cevabım ServerFault.com'daki buna benzer .

Muhafazakar Olmak

"Tüm ayrıcalıkları" vermekten daha muhafazakar olmak istiyorsanız, buna benzer bir şey denemek isteyebilirsiniz.

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO some_user_;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO some_user_;

publicOrada kullanımı, her yeni veritabanı / katalog için oluşturulan varsayılan şemanın adını ifade eder. Bir şema oluşturduysanız kendi adınızla değiştirin.

Şemaya Erişim

Bir şemaya tamamen erişmek için, herhangi bir işlem için kullanıcıya "kullanım" hakları verilmelidir. Bir kullanıcının seçim yapabilmesi, ekleyebilmesi, güncelleyebilmesi veya silebilmesi için önce kullanıcıya bir şema için "kullanım" izni verilmelidir.

Postgres'i ilk kullandığınızda bu gereksinimi fark etmeyeceksiniz. Varsayılan olarak her veritabanı adlı bir ilk şemaya sahiptir public. Ve her kullanıcıya varsayılan olarak otomatik olarak o belirli şema için "kullanım" hakları verilmiştir. Ek şema eklerken, açıkça kullanım hakları vermelisiniz.

GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;

Postgres belgesinden alıntı :

Şemalar için, belirtilen şemada bulunan nesnelere erişime izin verir (nesnelerin kendi ayrıcalık gereksinimlerinin de karşılandığı varsayılarak). Esasen bu, hibe alan kişinin şema içindeki nesneleri "aramasına" izin verir. Bu izin olmadan, örneğin sistem tablolarını sorgulayarak nesne adlarını görmek yine de mümkündür. Ayrıca, bu izni iptal ettikten sonra, mevcut arka uçlarda daha önce bu aramayı gerçekleştiren ifadeler olabilir, bu nedenle bu, nesne erişimini önlemenin tamamen güvenli bir yolu değildir.

Daha fazla tartışma için ŞEMA'DA HİBE KULLANIMI tam olarak ne işe yarar? Sorusuna bakın. . Postgres uzmanı Craig Ringer'ın yanıtına özellikle dikkat edin .

Varolan Nesneler Geleceğe Karşı

Bu komutlar yalnızca mevcut nesneleri etkiler. Gelecekte oluşturduğunuz tablolar ve benzerleri, yukarıdaki satırları yeniden çalıştırana kadar varsayılan ayrıcalıklara sahip olur. Varsayılanları değiştirerek gelecekteki nesneleri etkilemek için Erwin Brandstetter'ın diğer cevabına bakın .


1
Yukarıdaki iki hibeye ek olarak, bir hibe daha ihtiyacınız var: SCHEMA'DA KULLANIM VERİLMESİ public TO some_user_;
Ning Liu

1
@NingLiu HİBE KULLANIMI işaret ettiğiniz ve bana bunu öğrettiğiniz için çok teşekkürler. Cevaba bir bölüm ekledim.
Fesleğen Bourque

SCHEMA'DA HİBE KULLANIMI aradığım şeydi.
Basil Musa
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.