Postgresql

在不同的所有者下創建數據庫

  • March 31, 2020

我正在嘗試在 Postgres 中設置一個角色,它可以 a) 創建一個新角色 b) 創建一個新數據庫 c) 使該新角色成為數據庫的所有者 d) 沒有其他權限(盡可能!)

我試過這個:

sc_1=# CREATE ROLE tenant_admin CREATEDB CREATEROLE;
CREATE ROLE
sc_1=# CREATE ROLE user1 IN ROLE tenant_admin LOGIN NOINHERIT ENCRYPTED PASSWORD 'xyz';
CREATE ROLE
sc_1=# 

隨後(在另一個會話中)

tahaan@Komputer:~/projects/acme-project$ psql -U user1 -h localhost -d postgres
Password for user user1: 
psql (9.3.6)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

postgres=> SET ROLE tenant_admin;
SET                                                                                                                     
postgres=> CREATE DATABASE "Tenant1" TEMPLATE "tenant_template";
CREATE DATABASE
postgres=> CREATE ROLE "owner1";
CREATE ROLE
postgres=> ALTER DATABASE "Tenant1" OWNER TO "owner1";
ERROR:  must be member of role "owner1"
postgres=> 

背景:要求具有自動化功能,可以在多租戶系統中設置單獨的數據庫。我希望這個功能可以由一個沒有太多權限的角色來執行。

我找到了一個涉及一些額外步驟的解決方案。“tenant_admin”角色仍然以相同的方式創建,但現在使用如下:

postgres=> SET ROLE tenant_admin;
SET                                                                                                                     
postgres=> CREATE ROLE "owner3";
CREATE ROLE
postgres=> GRANT "owner3" TO "tenant_admin";
GRANT ROLE
postgres=> CREATE DATABASE "Tenant3" OWNER "owner3";
CREATE DATABASE
postgres=> REVOKE "owner3" from "tenant_admin";
REVOKE ROLE

嘗試創建新數據庫時,RDS 出現此問題。

要解決它:

以超級使用者身份登錄

psql --host=xxxxxxx --port=5432 --username=SUPERUSER_NAME --password --dbname=postgres

創建使用者

CREATE USER newuser WITH CREATEDB PASSWORD 'password';

登出

\q

登錄為newuser

psql --host=xxxxxxx --port=5432 --username=newuser --password --dbname=postgres

創建你的數據庫

CREATE DATABASE ....

引用自:https://dba.stackexchange.com/questions/96368