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
新しい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 ....
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;