すべてのプロダクト
Search
ドキュメントセンター

Hologres:スキーマレベルの簡易権限モデルの使用

最終更新日:Feb 04, 2026

このトピックでは、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 文を使用して、基本モードでスキーマレベルで対応するスキーマに対する関連権限をユーザーに付与できます。

  1. 関数呼び出しの有効化

    SLPM を有効にする前に、次のコマンドを実行して関数呼び出しを有効にします。例の extension はデータベースレベルです。このコマンドは、各データベースに対して一度だけ実行する必要があります。

    create extension slpm;
  2. SLPM の有効化

    SLPM はデフォルトで無効になっています。スーパーユーザーは、ターゲットデータベースで次の文を実行して有効にする必要があります。SLPM を有効にする際は、現在のデータベースで SQL 文が実行されていないことを確認してください。実行されている場合、操作が失敗し、サービスに影響を与える可能性があります。

    call slpm_enable ();  // 現在のデータベースで SLPM を有効にします。
  3. 任意:標準 PostgreSQL 権限モデルから SLPM への切り替え

    権限モデルは次のように確認できます。

    1. Hologres コンソールにログインします。左側のナビゲーションウィンドウで、Go to HoloWeb をクリックします。

    2. HoloWeb ページで、Security Center をクリックします。[DB 権限付与] ページで、現在の権限モデルを表示します。

    ご利用のデータベースが標準 PostgreSQL 権限モデルを使用しており、テーブル、ビュー、外部テーブルなどの複数のオブジェクトを含んでいる場合、slpm_migrate 関数を呼び出して、既存のユーザーの権限を SLPM に移行できます。

    call slpm_migrate ();  // データベース内の既存オブジェクトのオーナーを developer に変更し、SLPM で管理できるようにします。

    標準 PostgreSQL 権限モデルから SLPM に切り替える際の注意点は次のとおりです。

    デフォルトでは、slpm_migrate 関数は一度に 64 人のユーザーの権限しか移行しません。この数は調整可能です。多くのユーザーが関与している場合は、すべてのユーザーの権限が移行されるまで、この関数を複数回実行する必要があります。この関数の詳細については、slpm_migrate をご参照ください。

  4. 現在のインスタンスでのユーザーの作成

    新しいユーザーに権限を付与する前に、現在のインスタンスでユーザーを作成する必要があります。ユーザーがインスタンスに既に存在する場合は、このステップをスキップしてください。

    次のコマンドで、{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]');  // ユーザーを作成し、対応するユーザーグループに追加します。
    説明
    • RAM ユーザーの UID を使用して権限を付与する場合、slpm_create_user を実行するときに UID に p4_ プレフィックスを追加する必要があります。フォーマットは p4_UID です。UID は RAM コンソールの [ユーザー] ページから取得できます。RAM ユーザーのフォーマットの詳細については、アカウントの概要をご参照ください。

    • SLPM は、admindeveloperwriterviewer、または all_users で終わるカスタムアカウント名をサポートしていません。

  5. 新しいユーザーへの権限の付与

    インスタンスで新しいユーザーを作成した後、権限付与を完了するには、データベース内の適切なユーザーグループにユーザーを追加する必要があります。ユーザー作成時にユーザーグループに追加した場合は、再度権限を付与する必要はありません。

    次のコマンドで、{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 が不要になった場合は、次の手順でこの機能を無効にできます。

  1. 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 グループは既存のオブジェクトに対する権限を保持します。この権限は新しいデータベースオブジェクトには適用されません。

  2. ユーザーグループの削除 (管理を容易にするため、必要でない限りユーザーグループは削除しないでください)

    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 を再有効化するには、次の手順に従ってください。

  1. ユーザー権限のパージ

    権限の競合を避けるため、SLPM を再有効化する前に、次のコマンドを実行してデータベースから既存のすべてのユーザー権限をパージします。

    call slpm_cleanup ( '<dbname>' );
  2. SLPM 権限モデルの再有効化

    ユーザー権限をパージした後、次のコマンドを実行して SLPM 権限モデルを有効にします。

    -- 復元モードで SLPM を有効にします。
    call slpm_enable ('t'); 
    
    -- データベース内の既存オブジェクトのオーナーを developer に更新し、SLPM で管理できるようにします。このステップは必須です。
    call slpm_migrate ();
  3. ユーザーへの権限の付与

    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:

CREATE VIEW ads.customer_total_order_price_view AS
SELECT
    c_name,
    sum(o_totalprice)
FROM
    ods.orders AS o
INNER JOIN dwd.customer AS c
ON o.o_custkey = c.c_custkey
GROUP BY
    1;

クロススキーマビュー機能の有効化

  • 注意事項

    • クロススキーマビュー機能はデフォルトで無効になっています。

    • クロススキーマビューを作成する際、作成者はビューが存在するスキーマに対する developer 権限を持っている必要があります。また、作成者は、ビューで使用されるすべてのテーブルに対して viewer 以上の権限を持っている必要があります。

      説明されているシナリオでは、ads_dev_user アカウントを使用して ads スキーマに customer_total_order_price_view ビューを作成するには、ads_dev_user アカウントが ads スキーマに対する developer 権限と、ods および dwd スキーマに対する viewer 権限を持っている必要があります。

    • クロススキーマビューをクエリするには、ユーザーはビューが存在するスキーマに対して viewer 以上の権限を持っているだけで十分です。

      たとえば、アカウント ads_view_userads.customer_total_order_price_view ビューを表示するには、アカウント ads_view_userads スキーマに対する 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 のデフォルトの動作が復元されます。クロススキーマビューはクエリできなくなります。