Điều này dường như hoạt động nhưng có thể có hậu quả không lường trước được. Nó đòi hỏi mày mò với danh mục hệ thống, mà không thực sự là một ý tưởng tốt!
Trước hết, bạn phải cho phép superusers để cập nhật catalog hệ thống bằng cách thêm này để cấu hình postgresql của bạn:
allow_system_table_mods = on
và khởi động lại.
Bây giờ, bạn có thể sử dụng câu lệnh DDL để sửa đổi danh mục hệ thống (bạn nên sợ). Kết nối với một trong những cơ sở dữ liệu người dùng (một thử nghiệm người ta sẽ là một ý tưởng tốt) và:
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;
Bây giờ bạn sẽ thấy rằng nếu bạn kết nối với rằng cơ sở dữ liệu như một người dùng thấp priv, lệnh \l
sẽ chỉ cần liệt kê các cơ sở dữ liệu mà người dùng có thể kết nối.
Vấn đề là bây giờ bạn cần đoán cơ sở dữ liệu mà người dùng kết nối ban đầu để tìm nạp danh sách cơ sở dữ liệu của họ từ đó. Nếu họ kết nối với cơ sở dữ liệu riêng của họ ban đầu, thì có thể bạn đã hoàn thành vào thời điểm này. Nếu họ kết nối với postgres
hoặc template1
trước tiên, thì bạn cần thực hiện thay đổi này trên cơ sở dữ liệu đó thay thế. Dường như với tôi rằng điều này sẽ làm việc, vì danh mục pg_database
được giới thiệu bởi postgres backends trực tiếp bởi oid, chứ không phải theo tên, do đó, di chuyển nó ra khỏi con đường và thay đổi những hàng được hiển thị trong nó sẽ là vô hình đối với họ. Đặc biệt, bạn không thể dừng máy chủ phân biệt với người dùng giữa một cơ sở dữ liệu không tồn tại và chúng không có đặc quyền kết nối.
Tôi sẽ không thực hiện bất kỳ lời hứa nào rằng loại thay đổi này không làm hỏng thứ gì đó khác. Nếu nó phá vỡ, bạn có thể giữ các mảnh.
Bạn có thể muốn thực hiện thay đổi này trong cơ sở dữ liệu mẫu và tạo cơ sở dữ liệu người dùng từ đó trong tương lai và tắt cài đặt allow_system_table_mods
khi bạn hoàn tất (yêu cầu máy chủ khởi động lại, nhớ).
Ngoài ra, tôi đã thử nghiệm điều này trên 9,0: có vẻ như với tôi nó cũng hoạt động trên một số phiên bản cũ hơn, hãy báo trước emptor.
Tại sao không chỉ có nhiều phiên bản chạy cùng một lúc? –
Tôi cần phải chạy tất cả trên cùng một cổng. – Kai