如何在多个Postgresql数据库之间共享一个表

lub*_*bar 14 sql postgresql database-design login database-schema

我的网络应用程序有多个部署 - 每个部署都是一个具有唯一URL的唯一网站.
每个部署都有不同的数据,UI等,但是Postgresql数据库结构非常相似(使用PostGIS).数据库都存在于同一个DB服务器上.我希望1个部署的用户能够登录所有其他部署的应用程序,而无需重新注册.

我想要的是在多个应用数据库之间共享的单个"用户"表.任何在一个应用程序中注册的用户都应该被所有其他应用程序识别.Postgres有可能吗?模式是这样做的吗?

fil*_*rem 19

是的,模式是解决方案.使用单个PostgreSQL集群和一个数据库.

为所有应用用户创建一个组:

CREATE ROLE app;
Run Code Online (Sandbox Code Playgroud)

创建全局"app"模式,其中所有全局共享应用程序表都将存在.

CREATE SCHEMA AUTHORIZATION app;
CREATE TABLE app.objects ( objectid int PRIMARY KEY );
ALTER TABLE app.objects OWNER TO app;
Run Code Online (Sandbox Code Playgroud)

为每个部署创建单独的用户(没有超级用户权限):

CREATE USER app01 IN ROLE app;
CREATE USER app02 IN ROLE app;
Run Code Online (Sandbox Code Playgroud)

(可选)IN ROLE app您可以在选定的应用程序对象上为这些用户授予显式权限,而不是:

GRANT USAGE ON SCHEMA app TO app01;
GRANT SELECT on app.objects TO app01;
Run Code Online (Sandbox Code Playgroud)

创建私有模式,其中存在与部署相关的表:

CREATE SCHEMA AUTHORIZATION app01; 
CREATE SCHEMA AUTHORIZATION app02;
Run Code Online (Sandbox Code Playgroud)

现在,您已为每个部署的应用程序提供私有模式; 但与此同时,您可以共享全局数据.

什么是好的,是应用程序不必是模式感知的.如果您以用户身份连接,则SELECT * FROM froobles默认将解析SELECT * FROM app01.frooblesapp01.您不必指定架构名称.

作为额外措施,您可以使用表继承来按部署扩展全局对象:

CREATE TABLE app01.objects (
  localattr1 int,
  localattr2 text
)
INHERITS ( app.objects );
Run Code Online (Sandbox Code Playgroud)