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

2024-05-02

我的 Web 应用程序有多个部署 - 每个部署都是一个具有唯一 URL 的唯一站点。
每个部署都有不同的数据、UI 等,但有非常相似的 Postgresql 数据库结构(带有 PostGIS)。这些数据库都位于同一数据库服务器上。我希望来自 1 个部署的用户能够登录所有其他已部署的应用程序,而无需重新注册。

我想要的是在多个应用程序数据库之间共享的单个“用户”表。在一个应用程序中注册的任何用户都应该被所有其他应用程序识别。 Postgres 可以做到这一点吗?模式是做到这一点的方法吗?


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

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

CREATE ROLE app;

创建全局“应用程序”架构,所有全局共享应用程序表都将驻留在其中。

CREATE SCHEMA AUTHORIZATION app;
CREATE TABLE app.objects ( objectid int PRIMARY KEY );
ALTER TABLE app.objects OWNER TO app;

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

CREATE USER app01 IN ROLE app;
CREATE USER app02 IN ROLE app;

可选地,代替IN ROLE app,您可以为这些用户授予对选定应用程序对象的显式权限:

GRANT USAGE ON SCHEMA app TO app01;
GRANT SELECT on app.objects TO app01;

创建私有模式,其中依赖于部署的表将驻留在其中:

CREATE SCHEMA AUTHORIZATION app01; 
CREATE SCHEMA AUTHORIZATION app02;

现在,您为每个部署的应用程序都有一个私有模式;但同时您可以共享对全球数据的访问。

好处是应用程序不必具有模式感知能力。SELECT * FROM froobles默认情况下将解析为SELECT * FROM app01.froobles,如果您连接为app01用户。您不必指定架构名称。

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

CREATE TABLE app01.objects (
  localattr1 int,
  localattr2 text
)
INHERITS ( app.objects );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在多个Postgresql数据库之间共享表 的相关文章

随机推荐