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.froobles
为app01
.您不必指定架构名称.
作为额外措施,您可以使用表继承来按部署扩展全局对象:
CREATE TABLE app01.objects (
localattr1 int,
localattr2 text
)
INHERITS ( app.objects );
Run Code Online (Sandbox Code Playgroud)