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];
і БД тепер справді читається лише для [ім'я користувача]. Правильно? Я знову повернусь до цієї відповіді, коли прочитав гарну книгу Postgres :)