我的web应用有多个部署——每个部署都是一个具有唯一URL的唯一站点。
每个部署都有不同的数据、UI等,但Postgresql数据库结构非常相似(使用PostGIS)。所有数据库都位于同一个数据库服务器上。我希望来自1部署的用户能够登录到所有其他部署的应用程序,而无需重新注册。
我想要的是一个单独的“用户”表,可以在多个应用程序数据库中共享。任何在一个应用程序中注册的用户都应该被所有其他应用程序识别。
这对Postgres有可能吗?架构是这样做的吗?
最佳答案
是的,模式是解决方案。使用一个PostgreSQL集群和一个数据库。
为所有应用程序用户创建组:
CREATE ROLE app;
创建全局“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 );