このトピックでは、Hologres における簡易権限モデル (SPM) の使用方法について説明します。
簡易権限モデルによる権限付与
Hologres では、簡易権限モデルを用いて、インスタンス内での権限付与を以下の方法で実行できます。
SQL ステートメントを使用した権限付与
開発ツールを用いて Hologres インスタンスに接続した後、基本モードで SQL ステートメントを実行して、ユーザーに必要なインスタンス権限を付与できます。手順は以下のとおりです。
関数呼び出しの有効化
SPM を有効化する前に、以下のコマンドを実行して関数呼び出しを有効化します。
create extension spm;簡易権限モデルの有効化
簡易権限モデルはデフォルトで無効化されています。Superuser が対象 DB で以下のステートメントを実行して有効化する必要があります。関数の詳細については、「spm_enable」をご参照ください。
call spm_enable(); // 現在の DB に対して簡易権限モデルを有効化します。説明簡易権限モデルを有効化すると、開発者ユーザーグループは、DB のすべてのスキーマ内のすべてのテーブルおよびテーブル類似オブジェクトに対してデフォルト権限を取得します。
(任意) 標準 PostgreSQL 権限モデルからの移行
DB が標準 PostgreSQL 権限モデルを使用しており、テーブル、ビュー、外部テーブルなどのオブジェクトを含む場合、これらのオブジェクトを簡易権限モデルへ移行する必要があります。移行を行わないと、テーブルに対する権限が失われ、ビジネス運用に影響を及ぼす可能性があります。移行を実行するには、DB で以下のステートメントを実行します。
call spm_migrate(); // DB 内の既存オブジェクトの所有者を developer に変更し、SPM で管理します。新規作成された DB でオブジェクトが存在しない場合は、このステップをスキップできます。
説明簡易権限モデルを有効化する際は、現在の DB で実行中の SQL ステートメントがないことを確認してください。そうでない場合、操作が失敗し、サービスに影響を及ぼす可能性があります。
移行処理では多数のテーブルに対して ALTER OWNER 操作が実行されるため、PostgreSQL の制限に達する可能性があります。spm_migrate 関数は、各実行で max_locks_per_transaction 制限に達するまで、指定数のオブジェクトの所有者を変更します。すべてのオブジェクトを移行するには、spm_migrate を複数回実行する必要がある場合があります。関数の詳細については、「spm_migrate」をご参照ください。
ユーザーの作成
新しいユーザーに権限を付与する前に、現在のインスタンス内でユーザーを作成する必要があります。ユーザーがすでに存在する場合は、このステップをスキップできます。
Alibaba Cloud アカウントおよび RAM ユーザー:
call spm_create_user ('Alibaba Cloud アカウント UID/メールアドレス/RAM ユーザー'); // ユーザーを作成します。メールアドレスを使用する場合は、二重引用符で囲んでください。 call spm_create_user ('Alibaba Cloud アカウント UID/メールアドレス/RAM ユーザー', '<dbname>_[admin|developer|writer|viewer]'); // ユーザーを作成し、対応するユーザーグループに追加します。コマンド内の
dbnameは、現在の Hologres インスタンス内のデータベース名です。例:RAM ユーザー
xxx.onaliyun.comをdeveloperユーザーグループに、testdbデータベースに対して追加します。call spm_create_user ('xxx.onaliyun.com', 'testdb_developer');カスタムユーザー:
create user "BASIC$<user_name>" with password '<password>';
説明RAM ユーザーの場合、
spm_create_userを実行する際に、アカウント UID に p4_ プレフィックスを付与します(例:p4_UID)。カスタムユーザーの場合、ユーザー名は
admin、developer、writer、viewer、またはall_usersで終わってはいけません。
新しいユーザーへの権限付与
新しいユーザーがインスタンス内に作成された後、DB 内の適切なユーザーグループにユーザーを追加することで、権限付与を完了します。権限付与が完了すると、RAM ユーザーは開発ツールを用いて現在の DB に接続し、許可された範囲内で開発作業を実行できます。ユーザー作成時にユーザーグループへの追加を行った場合は、再度権限付与を行う必要はありません。関数の詳細については、「spm_grant」をご参照ください。
以下のコマンドでは、{dbname}_[admin|developer|writer|viewer] は、ユーザーを追加する対象となる、現在の DB 内のユーザーグループ名を指定します。詳細については、「ユーザーグループ」をご参照ください。
call spm_grant('{dbname}_[admin|developer|writer|viewer]', 'Alibaba Cloud アカウント ID/メールアドレス/RAM ユーザー'); // ユーザーをユーザーグループに追加します。以下に、異なる権限を持つユーザーグループへのユーザー追加例を示します。
// DB の admin グループにユーザーを追加します。 call spm_grant('mydb_admin', 'p4_564306222995xxx'); // RAM ユーザー 564306222995xxx を mydb データベースの admin グループに追加します。 call spm_grant('mydb_admin', '197006222995xxx'); // Alibaba Cloud アカウント 197006222995xxx を mydb データベースの admin グループに追加します。 call spm_grant('mydb_admin', 'ALIYUN$xxx'); // xxx@aliyun.com を mydb データベースの admin グループに追加します。 // DB の developer グループにユーザーを追加します。 call spm_grant('mydb_developer', 'p4_564306222995xxx'); // RAM ユーザー 564306222995xxx を mydb データベースの developer グループに追加します。 call spm_grant('mydb_developer', '197006222995xxx'); // Alibaba Cloud アカウント 197006222995xxx を mydb データベースの developer グループに追加します。 call spm_grant('mydb_developer', 'RAM$mainaccount:subuser');// Alibaba Cloud アカウント mainaccount の RAM ユーザー subuser を mydb データベースの developer グループに追加します。 // DB の viewer グループにユーザーを追加します。 call spm_grant('"MYDB_viewer"', 'p4_564306222995xxx'); // RAM ユーザー 564306222995xxx を "MYDB" データベースの viewer グループに追加します。 call spm_grant('"MYDB_viewer"', '197006222995xxx'); // Alibaba Cloud アカウント 197006222995xxx を "MYDB" データベースの viewer グループに追加します。 call spm_grant('mydb_viewer', '"xxx@aliyun.com"'); // アカウント xxx@aliyun.com を mydb データベースの viewer グループに追加します。
ユーザーグループの削除
Hologres では、簡易権限モデルを用いて、DB 内のユーザーグループからユーザーを削除できます。
SQL ステートメントを用いたユーザーグループの削除
DB 内のユーザーグループからユーザーを削除するには、以下のコマンドを実行します。関数の詳細については、「spm_revoke」をご参照ください。
call spm_revoke('<dbname>_[admin|developer|writer|viewer]', 'Alibaba Cloud アカウント ID/メールアドレス/RAM ユーザー'); // ユーザーの権限を取り消します。 // 例: // DB の admin グループからユーザーを削除します。 call spm_revoke('dbname_admin', 'p4_564306222995xxx');// RAM ユーザー 564306222995xxx を admin グループから削除します。 call spm_revoke('dbname_admin', '197006222995xxx');// Alibaba Cloud アカウント 197006222995xxx を admin グループから削除します。 call spm_revoke('dbname_admin', 'xxx@aliyun.com');// アカウント xxx@aliyun.com を admin グループから削除します。 // DB の developer グループからユーザーを削除します。 call spm_revoke('mydb_developer', 'RAM$mainaccount:subuser'); // mydb データベースの developer グループから RAM ユーザー subuser を削除します。 call spm_revoke('mydb_developer', 'p4_564306222995xxx');// RAM ユーザー 564306222995xxx を developer グループから削除します。 // DB の viewer グループからユーザーを削除します。 call spm_revoke('"MYDB_viewer"', 'p4_564306222995xxx'); // "MYDB" データベースの viewer グループから RAM ユーザー 564306222995xxx を削除します。
ユーザーの削除
インスタンスからユーザーを削除するには、以下のステートメントを実行します。
ユーザーを削除すると、そのユーザーは現在のインスタンスから完全に削除され、インスタンス上のすべての権限が取り消されます。慎重に実行してください。
DROP ROLE "Alibaba Cloud アカウント ID/メールアドレス/RAM ユーザー"; // インスタンスからユーザーを直接削除します。(任意)専門家モデルから簡易権限モデルへの切り替え
DB が標準 PostgreSQL 権限モデルを使用しており、テーブル、ビュー、外部テーブルなどのオブジェクトを含む場合、より優れた権限管理のために簡易権限モデルを有効化できます。spm_migrate 関数を呼び出して、既存のオブジェクトを簡易権限モデルへ移行できます。DB で以下のステートメントを実行します。
call spm_migrate(); // DB 内の既存オブジェクトの所有者を developer に変更し、SPM で管理します。簡易権限モデルを有効化する際は、現在の DB で実行中の SQL ステートメントがないことを確認してください。そうでない場合、操作が失敗し、サービスに影響を及ぼす可能性があります。
切り替え処理では多数のテーブルに対して ALTER OWNER 操作が実行される場合があります。ただし、spm_migrate ステートメントは、各実行で max_locks_per_transaction 制限に達するまで、指定数のオブジェクトの所有者を変更します。すべてのオブジェクトを移行するには、spm_migrate を複数回実行する必要がある場合があります。
簡易権限モデルの無効化
簡易権限モデルの無効化
Superuser は、必要に応じて DB で以下のステートメントを実行して、簡易権限モデルを無効化できます。関数の詳細については、「spm_disable」をご参照ください。
call spm_disable();簡易権限モデルを無効化しても、対応するユーザーグループは削除されません。これらのユーザーグループ内のユーザーの権限については、「SPM 関数」をご参照ください。
ユーザーグループのパージ
簡易権限モデルを無効化した後、必要に応じて spm_cleanup 関数を呼び出してユーザーグループをパージできます。これは以下のシナリオで有用です。
説明管理を容易にするため、ユーザーグループを削除しないことを推奨します。
シナリオ 1:DB を維持したままユーザーグループを削除
DB を継続して使用しつつ、DB 内のユーザーグループを削除したい場合は、Superuser が以下のステートメントを実行できます。関数の詳細については、「spm_cleanup」をご参照ください。
call spm_cleanup('{dbname}');説明spm_cleanup を呼び出す際は、DB 上で実行中の SQL ステートメントがないことを確認してください。そうでない場合、呼び出しが失敗し、サービスに影響を及ぼす可能性があります。
これは多数の業務テーブルに対して ALTER OWNER 操作を実行する可能性があるため、spm_cleanup は各実行で
max_locks_per_transaction制限に達するまで、指定数のオブジェクトの所有者を変更します。そのため、すべてのオブジェクトの移行および 4 つのユーザーグループの削除を完了するには、spm_cleanup を複数回実行する必要がある場合があります。シナリオ 2:DB を先に削除し、その後ユーザーグループを削除
元の DB をユーザーグループを削除せずに削除した場合、Superuser は postgres などの別の DB で以下のステートメントを実行して、対応するユーザーグループを削除できます。
call spm_cleanup('mydb');
簡易権限モデルの無効化に関する注意事項:
シャットダウン操作は Superuser のみが実行できます。
public ロールは public スキーマに対して USAGE および CREATE 権限を持ちます。
public ロールは DB に対して CONNECT および TEMPORARY 権限を持ちます。
public ロールは関数およびプロシージャに対して EXECUTE 権限を持ちます。
public ロールは
language、データの型(ドメインを含む)に対して USAGE 権限を持ちます。public ロールは、テーブル、ビュー、マテリアライズドビュー、テーブル列、シーケンス、外部データラッパー、外部サーバー、および public スキーマ以外のスキーマなど、その他のオブジェクトに対しては権限を持ちません。
簡易権限モデルを無効化した後のユーザーグループの権限は以下のとおりです。
admin グループ:既存オブジェクトに対する権限は保持されますが、新規データベースオブジェクトには適用されません。
developer グループ:既存オブジェクトに対する権限は保持されますが、新規データベースオブジェクトには適用されません。
writer グループ:既存オブジェクトに対する権限は保持されますが、新規データベースオブジェクトには適用されません。
viewer グループ:既存オブジェクトに対する権限は保持されますが、新規データベースオブジェクトには適用されません。
簡易権限モデルの再有効化
DB で以前に簡易権限モデルを有効化し、その後無効化して標準 PostgreSQL 権限モデルに切り替えた場合、必要に応じて以下のステートメントを実行して、簡易権限モデルを再び有効化できます。
call spm_enable('t'); // 現在の DB に対して簡易権限モデルを有効化します。
call spm_migrate(); // DB 内の既存オブジェクトの所有者を developer に変更し、SPM で管理します。簡易権限モデルを有効化する際は、現在の DB で実行中の SQL ステートメントがないことを確認してください。そうでない場合、操作が失敗し、サービスに影響を及ぼす可能性があります。
切り替え処理では多数のテーブルに対して ALTER OWNER 操作が実行される場合があります。ただし、spm_migrate ステートメントは、各実行で max_locks_per_transaction 制限に達するまで、指定数のオブジェクトの所有者を変更します。すべてのオブジェクトを移行するには、spm_migrate を複数回実行する必要がある場合があります。