このトピックでは、Hologres で SQL 文を使用してスキーマレベルの簡易権限モデル (SLPM) を使用する方法について説明します。
制限事項
SLPM はスキーマレベルで権限を厳密に制御します。権限を付与して使用する際は、次の制限事項にご注意ください。
-
異なるスキーマにまたがる 2 つ以上のテーブルを参照するビューまたはルールを作成した場合、スキーマ間で権限が共有されないため、そのビューまたはルールにアクセスできません。エラー
ERROR: permission denied for tableが報告されます。したがって、SLPM によって管理されるデータベースでは、クロススキーマのビューやルールを作成しないでください。クロススキーマビューを作成するには、SLPM モードでのクロススキーマビューの作成 (ベータ版) をご参照ください。 -
SLPM を有効にすると、特定の権限のみが付与されます。付与される権限の詳細については、スキーマレベルの簡易権限モデルを使用した権限の付与をご参照ください。以下の表に示す DDL 機能は SLPM では使用できません。代わりに、対応する SLPM 文を使用して操作を実行してください。関数の詳細については、スキーマレベルの簡易権限モデルの関数をご参照ください。
コマンド
説明
SLPM 文
alter table owner to xx
すべてのテーブルのオーナーは、対応するスキーマの developer ユーザーグループです。オーナーは変更できません。
手動での実行は不要です。
grant
ユーザーがユーザーグループに追加されると、そのグループの権限が付与されます。grant 文を実行する必要はありません。
slpm_grant
revoke
ユーザーから権限を取り消すには、対応するユーザーグループからユーザーを削除する必要があります。スタンドアロンの revoke 文は実行できません。
slpm_revoke
alter default privileges
標準権限モデルでは、grant は現在および過去のテーブルにのみ適用されます。将来のテーブルに対する権限は別途付与する必要があります。簡易モデルでは、テーブルがいつ作成されたかを考慮する必要はありません。ユーザーが正しいユーザーグループに属していれば、必要な権限を持ちます。将来のテーブルに権限を付与する必要はありません。
手動での実行は不要です。
create / drop / alter / rename default user groups
SLPM を有効にすると、admin、developer、writer、viewer などのデフォルトのユーザーグループが作成されます。スーパーユーザーを含むユーザーは、これらのデフォルトのユーザーグループを作成、変更、または削除することはできません。
該当なし。
rename schema
スキーマの名前を変更するには、データベースで直接
alter rename schemaコマンドを実行することはできません。slpm_rename_schemaコマンドを呼び出す必要があります。slpm_rename_schema
drop database
データベースを削除するには、
drop databaseを実行してからslpm_cleanup('<dbname>')を呼び出して、デフォルトのユーザーをパージする必要があります。drop databaseを実行してからslpm_cleanup('<dbname>')を呼び出して、デフォルトのユーザーをパージします。 -
クロススキーマビューの作成は、Hologres V1.3.36 以降でのみサポートされています。ご利用のインスタンスのバージョンが V1.3.36 より前の場合は、「インスタンスのアップグレード準備時に発生する一般的なエラー」をご参照いただくか、Hologres DingTalk グループに参加してフィードバックをお寄せください。詳細については、「オンラインサポートをさらに受けるにはどうすればよいですか?」をご参照ください。
スキーマレベルの簡易権限モデルを使用した権限付与
Hologres インスタンスを開発ツールに接続した後、SQL 文を使用して、基本モードでスキーマレベルで対応するスキーマに対する関連権限をユーザーに付与できます。
-
関数呼び出しの有効化
SLPM を有効にする前に、次のコマンドを実行して関数呼び出しを有効にします。例の extension はデータベースレベルです。このコマンドは、各データベースに対して一度だけ実行する必要があります。
create extension slpm; -
SLPM の有効化
SLPM はデフォルトで無効になっています。スーパーユーザーは、ターゲットデータベースで次の文を実行して有効にする必要があります。SLPM を有効にする際は、現在のデータベースで SQL 文が実行されていないことを確認してください。実行されている場合、操作が失敗し、サービスに影響を与える可能性があります。
call slpm_enable (); // 現在のデータベースで SLPM を有効にします。 -
任意:標準 PostgreSQL 権限モデルから SLPM への切り替え
権限モデルは次のように確認できます。
-
Hologres コンソールにログインします。左側のナビゲーションウィンドウで、Go to HoloWeb をクリックします。
-
HoloWeb ページで、Security Center をクリックします。[DB 権限付与] ページで、現在の権限モデルを表示します。
ご利用のデータベースが標準 PostgreSQL 権限モデルを使用しており、テーブル、ビュー、外部テーブルなどの複数のオブジェクトを含んでいる場合、slpm_migrate 関数を呼び出して、既存のユーザーの権限を SLPM に移行できます。
call slpm_migrate (); // データベース内の既存オブジェクトのオーナーを developer に変更し、SLPM で管理できるようにします。標準 PostgreSQL 権限モデルから SLPM に切り替える際の注意点は次のとおりです。
デフォルトでは、slpm_migrate 関数は一度に 64 人のユーザーの権限しか移行しません。この数は調整可能です。多くのユーザーが関与している場合は、すべてのユーザーの権限が移行されるまで、この関数を複数回実行する必要があります。この関数の詳細については、slpm_migrate をご参照ください。
-
-
現在のインスタンスでのユーザーの作成
新しいユーザーに権限を付与する前に、現在のインスタンスでユーザーを作成する必要があります。ユーザーがインスタンスに既に存在する場合は、このステップをスキップしてください。
次のコマンドで、{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer] は、ユーザーを追加できる現在のデータベースのユーザーグループ名です。詳細については、「ユーザーグループ」をご参照ください。
call slpm_create_user ('Alibaba Cloud アカウント ID/Alibaba Cloud メールボックス/RAM ユーザー'); // ユーザーを作成します。Alibaba Cloud メールボックスを使用する場合は、二重引用符で囲みます。 call slpm_create_user ('Alibaba Cloud アカウント ID/Alibaba Cloud メールボックス/RAM ユーザー', '{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer]'); // ユーザーを作成し、対応するユーザーグループに追加します。 -
新しいユーザーへの権限の付与
インスタンスで新しいユーザーを作成した後、権限付与を完了するには、データベース内の適切なユーザーグループにユーザーを追加する必要があります。ユーザー作成時にユーザーグループに追加した場合は、再度権限を付与する必要はありません。
次のコマンドで、{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer] は、ユーザーを追加できる現在のデータベースのユーザーグループ名です。詳細については、「ユーザーグループ」をご参照ください。
call slpm_grant ('{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer]', 'Alibaba Cloud アカウント ID/Alibaba Cloud メールボックス/RAM ユーザー'); // ユーザーをユーザーグループに追加します。次の例は、異なる権限を持つユーザーグループにユーザーを追加する方法を示しています。
// データベースの admin グループにユーザーを追加します。 call slpm_grant ('mydb.admin', '197006222995xxx'); // ユーザー 197006222995xxx を mydb データベースの admin グループに追加します。 call slpm_grant ('mydb.admin', 'ALIYUN$xxx'); // ユーザー xxx@aliyun.com を mydb データベースの admin グループに追加します。 // データベースの developer グループにユーザーを追加します。 call slpm_grant ('mydb.public.developer', '197006222995xxx'); // ユーザー 197006222995xxx を mydb データベースの developer グループに追加します。 call slpm_grant ('mydb.public.developer', 'RAM$mainaccount:subuser');// Alibaba Cloud アカウント mainaccount の RAM ユーザー subuser を mydb データベースの developer グループに追加します。 // データベースの viewer グループにユーザーを追加します。 call slpm_grant ('"MYDB.lisa.viewer"', '197006222995xxx'); // ユーザー 197006222995xxx を "MYDB" データベースの viewer グループに追加します。 call slpm_grant ('mydb.lisa.viewer', '"xxx@aliyun.com"'); // ユーザー xxx@aliyun.com を mydb データベースの viewer グループに追加します。
ユーザーグループからの削除
データベースのユーザーグループからユーザーを削除するには、次のコマンドを実行します。ユーザーが削除されると、そのユーザーグループの権限はなくなります。
次のコマンドで、{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer] は、ユーザーを追加できる現在のデータベースのユーザーグループ名です。詳細については、「ユーザーグループ」をご参照ください。
call slpm_revoke ('{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer]', 'Alibaba Cloud アカウント ID/Alibaba Cloud メールボックス/RAM ユーザー'); // ユーザーの権限を取り消します。
次の例は、異なる権限を持つユーザーグループからユーザーを削除する方法を示しています。
// データベースの admin グループからユーザーを削除します。
call slpm_revoke ('dbname.admin', 'p4_564306222995xxx');//RAM ユーザー 564306222995xxx を admin グループから削除します。
call slpm_revoke ('dbname.admin', '197006222995xxx');//Alibaba Cloud アカウント 197006222995xxx を admin グループから削除します。
call slpm_revoke ('dbname.admin', '"xxx@aliyun.com"');
// データベースの developer グループからユーザーを削除します。
call slpm_revoke ('mydb.lisa.developer', 'RAM$mainaccount:subuser'); // RAM ユーザー subuser を mydb データベースの developer グループから削除します。
call slpm_revoke ('mydb.public.developer', 'p4_564306222995xxx');//RAM ユーザー 564306222995xxx を developer グループから削除します。
// データベースの viewer グループからユーザーを削除します。
call slpm_revoke ('"MYDB.SCHEMA1.viewer"', 'p4_564306222995xxx'); // RAM ユーザー 564306222995xxx を "MYDB" データベースの viewer グループから削除します。
ユーザーを削除する
必要に応じてユーザーを削除することもできます。ユーザーが削除されると、そのユーザーは現在のインスタンスから削除され、インスタンスに対するすべての権限を失います。この操作は慎重に行ってください。
DROP ROLE "Alibaba Cloud アカウント ID/Alibaba Cloud メールボックス/RAM ユーザー"; // インスタンスからユーザーを削除します。
スキーマレベルの簡易権限モデルの無効化
SLPM が不要になった場合は、次の手順でこの機能を無効にできます。
-
SLPM の無効化
SLPM が有効になった後、スーパーユーザーは次の例のコマンドを実行して無効にできます。SLPM を無効にしても、ユーザーグループは削除されません。これらのグループのユーザーが保持する権限の詳細については、スキーマレベルの簡易権限モデルの関数をご参照ください。
call slpm_disable ();SLPM を無効にする際の注意点:
-
シャットダウン操作を実行できるのはスーパーユーザーのみです。
-
public スキーマに対する USAGE および CREATE 権限、データベースに対する CONNECT および TEMPORARY 権限、関数およびプロシージャに対する EXECUTE 権限、言語およびデータ型 (ドメインを含む) に対する USAGE 権限が PUBLIC に付与されます。
-
テーブル、ビュー、マテリアライズドビュー、テーブル列、シーケンス、外部データラッパー、外部サーバー、スキーマ (public スキーマを除く) などの他のオブジェクトに対する権限は PUBLIC には付与されません。これらの権限を付与するには、スーパーユーザーに連絡してください。
-
SLPM を無効にした後、{db}.admin、{db}.{schemaname}.developer、{db}.{schemaname}.writer、および {db}.{schemaname}.viewer グループは既存のオブジェクトに対する権限を保持します。この権限は新しいデータベースオブジェクトには適用されません。
-
-
ユーザーグループの削除 (管理を容易にするため、必要でない限りユーザーグループは削除しないでください)
SLPM を無効にした後、slpm_cleanup 関数を呼び出してユーザーグループを削除できます。次のシナリオでその方法を説明します。
-
シナリオ 1:データベースを保持したままユーザーグループを削除する
データベース内のユーザーグループを削除し、データベースを引き続き使用する場合は、スーパーユーザーが次の文を実行できます。
call slpm_cleanup ( '<dbname>' );説明slpm_cleanup を呼び出す際は、データベース上で SQL 文が実行されていないことを確認してください。実行されている場合、呼び出しが失敗し、サービスに影響を与える可能性があります。
slpm_cleanup 関数は、既存のオブジェクトの所有権を現在のユーザーに転送する必要があります。デフォルトでは、slpm_cleanup は一度に 64 個のオブジェクトの所有権しか転送しません。この数は調整可能です。したがって、すべてのオブジェクトが転送され (5 回未満の実行を推奨)、保持されているすべてのユーザーグループが削除されるまで、slpm_cleanup を複数回実行する必要がある場合があります。この関数の詳細については、slpm_cleanup をご参照ください。
-
シナリオ 2:データベースを削除してからユーザーグループを削除する
データベースを削除したが、そのユーザーグループがまだ存在する場合、スーパーユーザーは postgres などの別のデータベースで次の文を実行して、元のデータベースのすべてのユーザーグループを削除できます。
call slpm_cleanup ( 'mydb' );
-
SLPM の再有効化
何らかの理由で SLPM を再有効化するには、次の手順に従ってください。
-
ユーザー権限のパージ
権限の競合を避けるため、SLPM を再有効化する前に、次のコマンドを実行してデータベースから既存のすべてのユーザー権限をパージします。
call slpm_cleanup ( '<dbname>' ); -
SLPM 権限モデルの再有効化
ユーザー権限をパージした後、次のコマンドを実行して SLPM 権限モデルを有効にします。
-- 復元モードで SLPM を有効にします。 call slpm_enable ('t'); -- データベース内の既存オブジェクトのオーナーを developer に更新し、SLPM で管理できるようにします。このステップは必須です。 call slpm_migrate (); -
ユーザーへの権限の付与
SLPM を再有効化した後、Hologres コンソールまたは SQL コマンドを使用してユーザーに権限を付与できます。詳細については、ユーザーへの権限の付与をご参照ください。
SLPM モードでのクロススキーマビューの作成 (ベータ版)
クロススキーマビューの作成は、Hologres V1.3.36 以降でのみサポートされています。ご利用のインスタンスのバージョンが V1.3.36 より前の場合は、「インスタンスのアップグレード準備時に発生する一般的なエラー」をご参照いただくか、Hologres DingTalk グループに参加してフィードバックをお寄せください。詳細については、「オンラインサポートをさらに受けるにはどうすればよいですか?」をご参照ください。
シナリオの説明
SLPM はスキーマレベルでの簡単な権限管理を提供します。しかし、一部のビジネスシナリオでは、スキーマをまたいでビューを作成する必要がある場合があります。たとえば、オペレーションデータストア (ODS)、DWD、データウェアハウスサービス (DWS)、ADS などの異なるデータウェアハウスレイヤーに対してスキーマを作成し、各レイヤーにテーブルを作成できます。場合によっては、スキーマをまたいでビューを作成する必要があります。たとえば、DWS レイヤーと DWD レイヤーのテーブルを使用して、次の表に示すように、ビジネスサービス用の ADS レイヤーにビューを作成できます。
データベース | スキーマ | テーブル | 表示 |
erp_db |
ods |
orders |
該当なし |
dwd |
customer |
該当なし |
|
ads |
該当なし |
ビュー名: customer_total_order_price ビューの DDL: |
クロススキーマビュー機能の有効化
-
注意事項
-
クロススキーマビュー機能はデフォルトで無効になっています。
-
クロススキーマビューを作成する際、作成者はビューが存在するスキーマに対する
developer権限を持っている必要があります。また、作成者は、ビューで使用されるすべてのテーブルに対してviewer以上の権限を持っている必要があります。説明されているシナリオでは、
ads_dev_userアカウントを使用してadsスキーマにcustomer_total_order_price_viewビューを作成するには、ads_dev_userアカウントがadsスキーマに対するdeveloper権限と、odsおよびdwdスキーマに対するviewer権限を持っている必要があります。 -
クロススキーマビューをクエリするには、ユーザーはビューが存在するスキーマに対して
viewer以上の権限を持っているだけで十分です。たとえば、アカウント
ads_view_userがads.customer_total_order_price_viewビューを表示するには、アカウントads_view_userにadsスキーマに対するviewer以上の権限を付与するだけで十分です。 -
クロススキーマビュー機能を有効にすると、ビューを作成したユーザーがそのビューのオーナーになります。ビューを変更または削除できるのは、そのビューのオーナーだけです。
説明されているシナリオでは、
ads.customer_total_order_price_viewビューのオーナーはads_dev_userアカウントです。ads_dev_userアカウントをデータベースから削除する必要がある場合は、次の SQL 文を使用してビューの所有権を転送できます。新しいオーナーが、ビュー内のすべてのテーブルのスキーマに対するviewer以上の権限と、ビューが存在するスキーマに対するdeveloper権限を持っていることを確認してください。-- 構文 call slpm_alter_view_owner('view_name', 'Alibaba Cloud アカウント ID/Alibaba Cloud メールボックス/RAM ユーザー'); -- 例:ads.customer_total_order_price_view ビューの所有権を p4_xxxxx に転送します。 call slpm_alter_view_owner ('ads.customer_total_order_price_view', 'p4_xxxxx');
-
-
コマンドの使用
クロススキーマビューを作成するには、スーパーユーザーが次の SQL 文を実行してこの機能を有効にできます。
call slpm_enable_multi_schema_view();文が実行された後、クロススキーマビューを作成できます。
クロススキーマビュー機能の無効化
クロススキーマビューを作成する必要がなくなった場合は、次の SQL 文を実行してこの機能を無効にできます。
-- クロススキーマビュー機能を無効にします。
call slpm_disable_multi_schema_view();
-- すべてのビューの所有権を、ビューが存在するスキーマの developer ロールに転送します。
call slpm_migrate();
文が実行された後、非クロススキーマビューは引き続きクエリでき、SLPM のデフォルトの動作が復元されます。クロススキーマビューはクエリできなくなります。