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

时间:2011-11-27 03:38:08

标签: sql postgresql database-design login database-schema

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

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

3 个答案:

答案 0 :(得分:18)

是的,架构是解决方案。使用单个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 );

答案 1 :(得分:4)

filiprem的答案很棒..但是,我发现我还需要为用户设置路径app01app02

ALTER USER app01 SET SEARCH_PATH TO "$user",app;
ALTER USER app02 SET SEARCH_PATH TO "$user",app;

此外,如果您需要角色app来访问模式app01,app02中的表,您将需要以下代码:

-- grant all future tables
ALTER DEFAULT PRIVILEGES IN SCHEMA app01 GRANT SELECT ON TABLES TO app;

-- grant all existing tables
GRANT SELECT 
ON ALL TABLES IN SCHEMA app01
TO app

您可以拥有其他权限,而不是SELECT。用户app02也是如此。

更新:为了能够让用户app选择app01架构中的行,它至少需要USAGE架构app01权限{ {1}}(以及上面定义的表格权限SELECT):

GRANT USAGE ON SCHEMA app01 TO app; 

答案 2 :(得分:2)

看看dblink