Yeni oluşturulan bir kullanıcının neden veritabanına bağlandıktan sonra tablo oluşturmasına izin verildiğini merak ediyorum. Bir veritabanım var project2_core
:
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------------+--------------+-----------+-------------+-------------+-------------------------------
postgres | postgres | SQL_ASCII | C | C |
project2_core | atm_project2 | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2
template0 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
Çok uzak çok iyi. Şimdi bir kullanıcı oluşturuyorum:
postgres=# CREATE ROLE dietrich ENCRYPTED PASSWORD 'md5XXX' LOGIN NOCREATEROLE NOCREATEDB NOSUPERUSER
Tamam. Veritabanına bağlanmaya çalıştığımda, kullanıcının yapmasına izin verilmiyor:
$ psql -h localhost -p 5432 -U dietrich -W project2_core
Password for user dietrich:
psql: FATAL: permission denied for database "project2_core"
DETAIL: User does not have CONNECT privilege.
Beklediğim bu. Şimdi garip şeyler başlıyor. Kullanıcıya veriyorum CONNECT
:
postgres=# GRANT CONNECT ON DATABASE project2_core TO dietrich;
GRANT
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------------+--------------+-----------+-------------+-------------+-------------------------------
postgres | postgres | SQL_ASCII | C | C |
project2_core | atm_project2 | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2+
| | | | | dietrich=c/project2
template0 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
Ayrıca başka hibeler olmadan, kullanıcının bir tablo oluşturmasına izin verilir:
$ psql -h localhost -p 5432 -U dietrich -W project2_core
Password for user dietrich:
psql (9.2.3)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.
project2_core=> create table adsf ();
CREATE TABLE
project2_core=> \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | adsf | table | dietrich
(1 row)
Açıkça GRANT USAGE
şema üzerinde ve sonra GRANT SELECT
masalarda yapmadan önce, kullanıcının hiçbir şey yapmasına izin verilmemesi beklenirdi .
Benim hatam nerde? Neyi yanlış yapıyorum? İstediklerimi nasıl elde edebilirim (yeni bir kullanıcının açıkça uygun hakları vermeden önce hiçbir şey yapmasına izin verilmez.
Kayboldum ve yardımın büyük beğeni topluyor :)
EDIT @ daniel-verite tavsiyesinin ardından şimdi veritabanını oluşturduktan hemen sonra iptal ediyorum. Kullanıcı dietrich'in artık masa oluşturmasına izin verilmiyor. İyi. ANCAK : Şimdi, aynı zamanda veritabanının da sahibi olan project2 , tablo oluşturamaz. Hatta vermeden sonra GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2
ve GRANT ALL PRIVILEGES ON SCHEMA public TO project2
ben bir hata olsun hiçbir şema oluşturmak üzere seçildiğini: ERROR ve ben özellikle çalıştığımda CREATE TABLE public.WHATEVER ();
, ben olsun HATA: şema halk için reddedildi izni . Neyi yanlış yapıyorum?
REVOKE ALL ON DATABASE project2_core FROM PUBLIC;
. Bunun neden bir etkisi olmadı?