TL; DR: Новые пользователи могут создавать таблицы в public
схеме, потому что люди жаловались, что это было слишком сложно, когда они не могли.
Если вам не нравятся настройки по умолчанию, вам, вероятно, следует создать новую базу данных шаблонов с начальной конфигурацией, которую вы хотите. Например, вы можете:
DROP SCHEMA public;
или
REVOKE ALL ON SCHEMA public FROM public;
GRANT USAGE ON SCHEMA public TO public;
в вашем шаблоне.
Если вы хотите, чтобы public
пользователь не имел прав на базу данных, вам следует дополнительно:
REVOKE ALL ON DATABASE mydbname FROM public;
GRANT CONNECT ON DATABASE mydbname TO public;
так что public
пользователь не может создавать схемы или использовать временные таблицы.
Лично, если бы я проектировал это, я бы дал пользователям TEMP
право на базу данных по умолчанию, но не CREATE
(схемы в базе данных) или CREATE
(таблицы в public
схеме). Я бы зарезервировал их для владельца.
Это выбор, который был сделан давным-давно, и изменить его сейчас довольно сложно.
На самом деле, есть регулярные жалобы на то, что слишком сложно начать работу с PostgreSQL, потому что вам нужно создать учетную запись пользователя и часто хотеть создать базу данных. Почему бы нам просто не создать их автоматически и не использовать по умолчанию доверие в качестве режима авторизации, чтобы упростить его? Почему postgres
пользователь по умолчанию не имеет пароль postgres
? Почему бы нам просто не создавать пользователей автоматически, если они существуют в ОС? и т.п.
Есть некоторые подлинные проблемы с юзабилити для новых пользователей - в частности, большинство людей не имеют ни малейшего представления о том, что такое peer
auth, или почему простой запуск psql
после установки PostgreSQL говорит им, что нет пользователя с именем, в которое они вошли.
Это также грязный pg_hba.conf
файл конфигурации, но пользователи создаются на уровне SQL. Этот раскол смущает пользователей.
Однако многие вещи - это компромиссы между безопасными значениями по умолчанию и простыми значениями по умолчанию, когда проект никогда не сделает всех счастливыми.
revoke create on database [databasename] from [username];
и БД теперь действительно доступна только для [имя пользователя]. Правильно? Я вернусь к этому ответу снова, когда прочитаю хорошую книгу