新しく作成したユーザーがデータベースに接続した後にテーブルを作成できるのはなぜだろうかと思っています。私は1つのデータベースを持っています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
からテーブルを実行する前に、ユーザーが何もできないことを期待していました。
私の間違いはどこですか?何が間違っていますか?私が望むものを達成するにはどうすればよいですか(新しいユーザーが適切な権利を明示的に付与する前に何もすることはできません)。
私は失われました、そしてあなたの助けは大歓迎です:)
編集 @ daniel-veriteのアドバイスに従って、データベースの作成後すぐにすべてを取り消します。ユーザーdietrichは、これ以上テーブルを作成できません。良い。しかし:今、また、データベースの所有者は、Project2のは、テーブルを作成することはできません。GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2
and を発行した後でもGRANT ALL PRIVILEGES ON SCHEMA public TO project2
、エラーERROR:no schema are selected to create to createCREATE TABLE public.WHATEVER ();
を取得し、具体的にしようとすると、ERROR:permission denied for schema publicを取得します。私は何を間違えていますか?
REVOKE ALL ON DATABASE project2_core FROM PUBLIC;
。なぜこれは効果がなかったのですか?