web-dev-qa-db-ja.com

別の所有者の下にデータベースを作成する

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

背景:マルチテナントシステムで個別のデータベースをセットアップできる自動化機能が必要です。私の希望は、この機能があまり権限のない役割で実行できることです。

6
Johan

いくつかの追加手順を含む解決策を見つけました。 「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
8
Johan

新しいDBを作成しようとしたときに、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

DBを作成する

CREATE DATABASE ....
6
Rafael Oliveira

Postgresでユーザーを作成する、postgresで別のユーザーの下にデータベースを作成する、postgresで新しいユーザーを使用して別のデータベースでスキーマを作成する、

Postgres-userとしてログイン

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

データベースを作成します。

postgres=>CREATE DATABASE newdb;

新規ユーザーを作成:

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

許可を与える:

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

新規ユーザーで新規データベースにログインします。

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

Newdbで新しいユーザー「user1」を使用してスキーマを作成するには:

newdb=> CREATE SCHEMA s1;

特定のdbからpostgresのすべてのスキーマをリストするには、次のように入力します。

SELECT * from information_schema.schemata;