HATA: Bir SELECT'i salt okunur bir kullanıcı olarak denerken Postgres'te ilişki tablo adı için izin reddedildi


89
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

Salt okunur kullanıcı bağlanabilir, tabloları görebilir, ancak basit bir seçim yapmaya çalıştığında:

ERROR: permission denied for relation mytable
SQL state: 42501

Bu PostgreSQL 9.1'de gerçekleşiyor

Neyi yanlış yaptım?


1
"İlişki tablosu" hakkında biraz bilgi verebilir misiniz? Şema, bu "gerçek" bir tablo mu (veya bir görünüm / işlev), tetikler ...
Igor Romanchenko

Yanıtlar:


162

İşte yakın zamanda güncellenen PostgreSQL 9+ için eksiksiz çözüm.

CREATE USER readonly  WITH ENCRYPTED PASSWORD 'readonly';
GRANT USAGE ON SCHEMA public to readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;

-- repeat code below for each database:

GRANT CONNECT ON DATABASE foo to readonly;
\c foo
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; --- this grants privileges on new tables generated in new database "foo"
GRANT USAGE ON SCHEMA public to readonly; 
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

Birçok önemli husus için https://jamie.curle.io/creating-a-read-only-user-in-postgres/'e teşekkürler

Herhangi biri daha kısa bir kod bulursa ve tercihen bunu mevcut tüm veritabanları için gerçekleştirebilecek bir kod bulursa, fazladan tebrikler.


6
bu görünümleri içeriyor mu?
Frank Conry

9
Neden GRANT ALLvarsayılan olarak salt okunur kullanıcıya izin veriyorsunuz ?
Slava Fomin II

1
tam olarak tanımlandığı gibi verdim, yine de sam hatası
Anish Gopinath

kullanılarak verilen hakları onaylayabilir \ddp. Salt okunur erişim için olduğu =r/gibi granting_user=r/readonly_usergösterilmelidir.
Greg Bray

Bu sorudaki kelimesi kelimesine SQL. Nasıl bir çözüm sağladığını görmüyorum.
r351574nc3

12

Eklemeyi dene

GRANT USAGE ON SCHEMA public to readonly;

Şemadaki nesneleri kullanmak için şema için gerekli izinlere sahip olmanız gerektiğinin muhtemelen farkında değildiniz.


Garip bir şey oluyor, bu komutları kullanıcı psqlolarak kullanarak sunucuda çalıştırıyorum postgresve uygun bir yanıt alıyorum GRANT,. Yine de, tablolardaki ACL'ye baktığımda, biri veritabanı sahibi jirauser, diğeri salt okunur olarak adlandırılan iki hesap görüyorum qauser. Ama benim readonlyorada görünmüyor. Postgres sürüm 9.1 ve hatta sunucuyu yeniden başlattım, hala hiçbir şey olmuyor.
sorin

2
psql konsolunda \ du çıktısı nedir / neydi? Hala bu çıktıyı verebilir misin yoksa cevabındaki gibi zaten düzeltildi mi?
sufleR

Çıktı doğru olduğundan (GRANT) ne olduğunu gerçekten bilmiyorum. Dün işe yaramadı, ama bugün yine 3 komutun hepsini çalıştırdıktan sonra çalıştı.
sorin

3
Not: Bunun beklenen yanıtı sadece "HİBE" dir. 'UYARI: "genel" için hiçbir ayrıcalık verilmediğini görürseniz, o zaman çalışmadı. Kullanıcı salt okunurdur, kendilerine ek izinler veremez. Bunu yalnızca 'GRANT' izinlerine sahip bir kullanıcı yapabilir, bu nedenle muhtemelen süper kullanıcı olarak oturum açmanız gerekir.
PeterVermont

Merhaba, SCHEMA'DAKİ TÜM TABLOLAR ÜZERİNDEKİ SEÇİMİ SONRAYA GETİRMEYE AÇIK VERMEYE; yanıt verir: HATA: ilişki veri tabanı için izin reddedildi. Neyi yanlış yaptığımı biliyor musun? Teşekkürler (GAppEngine Posgres9.6'da genel adresi kullanarak ve terminalden erişerek gerçekleşir)
Mike

-5

Bu benim için çalıştı:

Şunu kullanarak oturum açmış olduğunuz mevcut rolü kontrol edin: SELECT CURRENT_USER, SESSION_USER;

Not : Şema Sahibi ile eşleşmelidir.

Şema | İsim | Türü | Sahibi
-------- + -------- + ------- + ----------

Sahip farklıysa, yönetici rolünden geçerli kullanıcı rolüne tüm hibeleri şu şekilde verin:

'ROLE_OWNER' 'ı' MEVCUT ROLENAME 'VER;

Sonra sorguyu çalıştırmayı deneyin, tüm ilişkilere şimdi erişimi olduğu için çıktıyı verecektir.


5
Sahibin salt okunur adlı bir kullanıcı olarak değiştirilmesi doğru düzeltme gibi görünmüyor.
Anna

Durumunuza bağlı olarak, yanlış masa sahibi gerçekten de sebep olabilir (bu benim düşmanımdı). PostgreSQL'de tablo sahiplerini değiştirmenin doğru yolu: bkz. Stackoverflow.com/a/13535184
tanius

-6

Kullanıcınızın rolünde özniteliklere sahip olduğundan emin olun. Örneğin:

postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      |                                                | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}

aşağıdaki komutu uyguladıktan sonra:

postgres=# ALTER ROLE flux WITH Superuser;
ALTER ROLE
postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      | Superuser                                      | {}
postgres  | Superuser, Create role, Create DB, Replication | {}

sorunu çözdü.

roller ve şeyler için öğreticiye buradan bakın: https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2


18
Hayır! Süper kullanıcı rolünü, bir "seçim" yapmak için "salt okunur" adlı bir kullanıcıya vermek doğru düzeltme değildir.
Anna

@Anna Burada olan şey bu değil. Bu ileti dizisi salt okunur erişim vermekle ilgili değil. Bu iş parçacığı, bir kullanıcıya başka bir kullanıcıya salt okunur erişim izni vermekle ilgilidir. IMHO, bu doğru. Kullanıcınız Süper Kullanıcı değilse, salt okunur bir kullanıcı oluşturamazsınız. Karşılaşılan hata, salt okunur bir kullanıcı oluşturabilmekten kaynaklanıyorERROR: permission denied for relation mytable
r351574nc3

-7

Bir sonraki sorguyu yürütmelisiniz:

GRANT ALL ON TABLE mytable TO myuser;

Veya hatanız bir görünümdeyse, o zaman tablonun izni olmayabilir, bu nedenle bir sonraki sorguyu yürütmelisiniz:

GRANT ALL ON TABLE tbm_grupo TO myuser;

5
Kullanıcıya "salt okunur" denir. Kullanıcıya tüm izinleri vermenin amaç olduğu şüphelidir. Sadece seçim yapmak istiyor.
Anna

Bu, ALTER DROP DELETEEct veriyorsanız kullanıcıyı 'Salt Okunur' olarak adlandırmanın amacını ortadan kaldırır. O kullanıcıya ...
JayRizzo
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.