web-dev-qa-db-fra.com

Création d'une base de données sous un autre propriétaire

J'essaie de créer un rôle dans Postgres qui peut a) Créer un nouveau rôle b) Créer une nouvelle base de données c) Faire de ce nouveau rôle le propriétaire de la base de données d) N'avoir aucun autre droit (dans la mesure du possible!)

J'ai essayé ceci:

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=# 

Suivi par (dans une autre session)

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=> 

Contexte: l'exigence est d'avoir une fonction automatisée qui peut configurer des bases de données distinctes dans un système à locataires multiples. J'espère que cette fonction pourra être remplie par un rôle qui n'a pas trop de droits.

6
Johan

J'ai trouvé une solution impliquant quelques étapes supplémentaires. Le rôle "tenant_admin" est toujours créé de la même manière, mais il est désormais utilisé comme suit:

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
8
Johan

Eu ce problème avec RDS lors de la tentative de création d'une nouvelle base de données.

Pour le résoudre:

Connectez-vous en tant que superutilisateur

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

Créer l'utilisateur

CREATE USER newuser WITH CREATEDB PASSWORD 'password';

Se déconnecter

\q

Connectez-vous en tant que newuser

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

Créez votre DB

CREATE DATABASE ....
6
Rafael Oliveira

Pour créer un utilisateur dans postgres, créer une base de données sous un autre utilisateur dans postgres, créer un schéma sous une base de données différente avec un nouvel utilisateur dans postgres,

Connectez-vous en tant qu'utilisateur Postgres

psql --Host=xxxxxxx --port=5432 --username=postgres --password

créer une base de données:

postgres=>CREATE DATABASE newdb;

Créer un nouvel utilisateur:

postgres=>CREATE USER user1 WITH PASSWORD 'uSeRi04o8';

Donner la permission:

postgres=>GRANT ALL PRIVILEGES ON DATABASE "newdb" to user1;

Connectez-vous à New-Database avec un nouvel utilisateur:

postgres=> \connect newdb user1
...
You are now connected to database "newdb" as user "user1".
newdb=> 

Pour créer un schéma avec le nouvel utilisateur "user1" dans newdb:

newdb=> CREATE SCHEMA s1;

Pour répertorier tous les schémas en postgres à partir d'une base de données spécifique:

SELECT * from information_schema.schemata;
0