目标:为每个租户或应用提供一个私有的独立database,多个Database之间的数据存放物理隔离。
本文实验环境:PostgreSQL11.8
步骤:
创建测试数据库testdb和用户bert.
postgres=# create user bert encrypted password 'abc123';
CREATE ROLE
postgres=# create database testdb owner bert;
CREATE DATABASE
复制
在PG中,默认情况下,新建的用户隶属于public角色,是可以登录任意database的。针对本文的多租户架构,要求每个应用拥有独立Database的场景,我们要阻止这种情况发生,只允许某些特定的用户登录特定Database。这可以通过对特定Database回收public的connect权限实现。可以在一个事务内完成所有DDL,确保所有操作要么全部成功,要么全部失败。如下:
postgres=# \c testdb
You are now connected to database "testdb" as user "postgres".
testdb=# begin;
BEGIN
testdb=# revoke connect on database testdb from public;
REVOKE
testdb=# grant connect on database testdb to bert;
GRANT
testdb=# commit;
COMMIT
复制
测试:
通过上述命令在testdb上收回public的connect权限后,其它用户就不能够连接到testdb上了(super user除外),这正是多租户架构中采用独立Database所需要的。
testdb=# create user bob encrypted password 'abc123';
CREATE ROLE
testdb=# \q
[postgres@bighouse3 ~]$
[postgres@bighouse3 ~]$ psql -h bighouse3 -p 15432 -U bob testdb
Password for user bob:
psql: FATAL: permission denied for database "testdb"
DETAIL: User does not have CONNECT privilege.
[postgres@bighouse3 ~]$ psql -h bighouse3 -p 15432 -U bert testdb
Password for user bert:
psql (11.8)
Type "help" for help.
testdb=>
复制
延伸:
与采用多个schema的多租户架构相比,采用独立的Database更安全和方便,其它人不能看到你Database下的任何对象信息,备份和恢复也更方便。
这篇笔记参考自:PostgreSQL 10 Administration Cookbook
Postgresql多租户实践--使用多个Schema篇
Postgresql多租户实践--使用多个Database篇
Postgresql多租户实践--使用多个Instance篇
文章转载自长河的笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。