मैं सोच रहा हूं कि एक डेटाबेस से कनेक्ट होने के बाद एक नव निर्मित उपयोगकर्ता को टेबल बनाने की अनुमति क्यों है। मेरे पास एक डेटाबेस है 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)
अब तक सब ठीक है। अब मैं एक उपयोगकर्ता बनाता हूं:
postgres=# CREATE ROLE dietrich ENCRYPTED PASSWORD 'md5XXX' LOGIN NOCREATEROLE NOCREATEDB NOSUPERUSER
ठीक है। जब मैं डेटाबेस से कनेक्ट करने का प्रयास करता हूं, तो उपयोगकर्ता को ऐसा करने की अनुमति नहीं है:
$ 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.
यह वही है जिसकी मुझे उम्मीद थी। अब अजीब सामान शुरू होता है। मैं उपयोगकर्ता को अनुदान देता हूं 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)
और बिना किसी और अनुदान के, उपयोगकर्ता को एक तालिका बनाने की अनुमति है:
$ 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)
मुझे उम्मीद होगी कि GRANT USAGE
स्कीमा पर और फिर GRANT SELECT
तालिकाओं पर स्पष्ट रूप से करने से पहले उपयोगकर्ता को कुछ भी करने की अनुमति नहीं है ।
मेरी गलती कहाँ है? मैं क्या गलत कर रहा हूं? मैं वह प्राप्त कर सकता हूं जो मैं चाहता हूं (कि एक नए उपयोगकर्ता को उसे उचित अधिकार देने से पहले कुछ भी करने की अनुमति नहीं है।
मैं हार गया, और आपकी मदद की बहुत सराहना की :)
EDIT @ daniel-verite द्वारा सलाह के बाद, मैं अब डेटाबेस बनाने के तुरंत बाद सभी को रोक देता हूं। उपयोगकर्ता डायट्रीच को किसी भी तालिका को बनाने की अनुमति नहीं है। अच्छा। लेकिन : अब, डेटाबेस के मालिक, प्रोजेक्ट 2 को भी तालिका बनाने की अनुमति नहीं है। जारी करने GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2
और जारी करने के बाद भी GRANT ALL PRIVILEGES ON SCHEMA public TO project2
, मुझे एक त्रुटि मिलती है ERROR: कोई स्कीमा बनाने के लिए नहीं चुना गया है , और जब मैं विशेष रूप से प्रयास करता CREATE TABLE public.WHATEVER ();
हूं, तो मुझे त्रुटि मिलती है : स्कीमा जनता के लिए अनुमति से इनकार कर दिया गया । मैं क्या गलत कर रहा हूं?
REVOKE ALL ON DATABASE project2_core FROM PUBLIC;
। इसका कोई प्रभाव क्यों नहीं पड़ा?