办公
互联网中间件
合作伙伴
智能管理
备份
大数据
本文主要介绍 RDS-PostgreSQL 高权限账号具有的功能,以及在不同场景下的最佳实践。
背景信息
RDS-PostgreSQL 支持高权限账号。在创建 RDS-PostgreSQL 实例时,系统自动创建的账号即为高权限账号。通过高权限账号,您可以根据业务需要创建并管理多个业务账号和业务数据库,从而在一个实例内实现权限隔离和数据隔离。
:
由于系统创建的高权限账号的默认 Database 是 postgres,是系统 Database,不适用于创建业务数据库。因此建议您使用高权限账号创建业务账号,通过业务账号创建业务数据库。
1. 多账号权限隔离
在很多场景,您可能希望不同职能的人员对数据库具有不同的操作权限。例如:部分职能人员的账号可以创建数据库和表,部分账号可以对数据进行增删改查操作,而部分人员的账号只能对数据进行读取操作。通过高权限账号,您可以创建多个业务账号,并对不同的业务账号授予不同的操作权限,从而实现权限分离。
2. 多个应用数据隔离共享实例资源
为节省开支,您可以将多个应用部署在同一个数据库实例中,通过不同的业务数据库对应用进行隔离。不同应用之间共享 RDS-PostgreSQL 的资源,包括:CPU 资源、内存资源及存储资源。因此对于多个应用,您只需维护一个数据库实例即可。
前提条件
您已成功创建 RDS-PostgreSQL 实例,可参考创建常规实例。
权限隔离:创建业务数据库及业务账号
方案1: 业务账号为业务数据库的 Owner,拥有业务数据库的所有权限。
1. 高权限帐号通过以下命令创建有登录权限的业务账号。
CREATE USER Newuser-Name LOGIN PASSWORD 'Password'; |
:
2. 通过以下命令,为业务账号创建业务数据库。
GRANT Newuser-Name to Rootuser-Name; CREATE DATABASE Newdb-Name OWNER Newuser-Name; REVOKE Newuser-Name from Rootuser-Name; |
:
3. 业务账号通过以下命令访问业务数据库进行建表等操作。
psql -U Newuser-Name r -h Domain-Name -p Port Newdb-Name; |
:
方案2:高权限账号为业务数据库的 Owner,高权限账号向业务账号授予业务数据库的权限。
1. 高权限帐号通过以下命令创建有登录权限的业务账号。
CREATE USER Newuser-Name LOGIN PASSWORD 'Password'; |
:
2. 通过以下命令,创建业务数据库。
CREATE DATABASE Newdb-Name; |
:
Newdb-Name:业务数据库的名称。
3. 业务账号通过以下命令授权业务数据库相应的权限。
GRANT ALL ON DATABASE Newdb-Name TO Newuser-Name; |
4. 业务账号通过以下命令访问业务数据库并进行建表等操作。
psql -U Newuser-Name -h Domain-Name -p Port Newdb-Name; |
:
数据隔离:业务数据库权限分离
1. 通过以下命令,创建业务数据库。
CREATE DATABASE Newdb-Name; |
:
Newdb-Name:数据库的名称。
2. 通过以下命令,创建 DDL 账号,并授予 DDL 账号对业务数据库的所有权限。
CREATE USER Deployuser-Name LOGIN PASSWORD 'Password-ddl'; GRANT ALL ON DATABASE Newdb-Name TO Deployuser-Name; |
:
3. 通过以下命令,创建 DML 账号,并授予 DML 账号对指定业务数据库增删改查所有业务表的权限。
CREATE USER Dmluser-Name LOGIN PASSWORD 'Password-dml'; GRANT CONNECT ON DATABASE Newdb-Name TO Dmluser-Name; \c Newdb-Name; GRANT INSERT,UPDATE,DELETE,SELECT ON ALL TABLES IN SCHEMA public TO Dmluser-Name; |
:
4. 通过以下命令,创建只读账号,并授予只读账号查询业务库中所有业务表的权限。
CREATE USER Readonlyuser-Name LOGIN PASSWORD 'Password-readonly'; GRANT CONNECT ON DATABASE newdb TO readonlyuser; \c Newdb-Name; GRANT SELECT ON ALL TABLES IN SCHEMA public TO Readonlyuser-Name; |
: