Это похоже на работу, но может иметь непредвиденные последствия. Это требует возиться с системными каталогами, что на самом деле не очень хорошая идея!
Во-первых, вы должны разрешить суперпользователям обновить системные каталоги, добавив в ваш PostGreSQL конфигурации:
allow_system_table_mods = on
и рестарт.
Теперь вы можете использовать операторы DDL для изменения системных каталогов (вы должны бояться). Подключение к одной из пользовательских баз данных (анализ можно было бы хорошая идея), а также:
alter table pg_catalog.pg_database rename to pg_database_catalog;
create view pg_catalog.pg_database as
select oid, 1262::oid as tableoid, pg_database_catalog.*
from pg_catalog.pg_database_catalog
where has_database_privilege(pg_database_catalog.oid, 'connect');
grant select on pg_catalog.pg_database to public;
Теперь вы должны найти, что при подключении к , что баз данных как низко собств пользователя, команда \l
будет просто перечислите базы данных, к которым этот пользователь может подключиться.
Проблема заключается в том, что теперь вам нужно угадать, к какой базе данных пользователи подключаются, изначально для извлечения списка своей базы данных. Если они сначала подключаются к своей собственной базе данных, тогда вы, вероятно, уже закончите. Если они сначала подключаются к postgres
или template1
, вам необходимо внести это изменение в эту базу данных.
Мне кажется, что это должно сработать, так как каталог pg_database
ссылается на postgres backends напрямую с помощью oid, а не по имени, поэтому перемещение его в сторону и изменение того, какие строки показаны в нем, должно быть невидимым им. В частности, вы не можете остановить сервер, отличающийся от пользователя, между существующей базой данных и отсутствием прав на подключение.
Я не собираюсь делать никаких обещаний, что такого рода изменения не заведут что-то еще по линии. Если он ломается, вы можете держать куски.
Возможно, вы захотите внести это изменение в базу данных шаблонов и создать в будущем базы данных пользователей, а затем отключите параметр allow_system_table_mods
(что требует перезапуска сервера, помните).
Кроме того, я тестировал это на 9.0: мне кажется, что он должен работать и на некоторых более ранних версиях, остерегайтесь emptor.
Почему бы просто не запустить сразу несколько экземпляров? –
Мне нужно запустить их все в одном порту. – Kai