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

Hologres:SPM の使用

最終更新日:Jan 11, 2025

このトピックでは、Hologres で簡易権限モデル (SPM) を使用する方法について説明します。

SPM を使用してユーザーを承認する

Hologres でインスタンスのユーザーを承認するために SPM を使用する場合、次の方法を使用できます。

  • SQL ステートメントを実行してユーザーを承認する

    Hologres インスタンスを開発ツールに接続した後、SQL ステートメントを実行して SPM を使用してユーザーを承認できます。この方法では、ユーザーはインスタンスに必要な権限が付与されます。SPM を使用してユーザーを承認するには、次の手順を実行します。

  1. 関数呼び出しを有効にする。

    SPM を有効にする前に、次のステートメントを実行して関数呼び出しを有効にする必要があります。

    create extension spm;
  2. SPM を有効にする。

    デフォルトでは、SPM は無効になっています。スーパーユーザーとして次のステートメントを実行して、データベースの SPM を有効にできます。 spm_enable 関数の詳細については、spm_enable をご参照ください。

    call spm_enable ();  // 現在のデータベースの SPM を有効にします。
    説明

    データベースの SPM を有効にすると、開発者ユーザーグループのユーザーには、データベースのすべてのスキーマのテーブルおよびテーブルのようなオブジェクトに対する権限が付与されます。

  3. オプション: 既存のオブジェクトに対して標準の PostgreSQL 承認モデルから SPM に切り替える。

    データベースが標準の PostgreSQL 承認モデルを使用し、データベースにテーブル、ビュー、外部テーブルなどのオブジェクトが含まれている場合は、これらのオブジェクトの所有権を SPM で指定した開発者に転送する必要があります。そうしないと、ユーザーはオブジェクトを管理する権限を持たず、ビジネスに影響を与える可能性があります。オブジェクトの所有権を転送するには、次のステートメントを実行します。

    call spm_migrate(); // データベース内の既存のオブジェクトの所有権を、SPM で指定された開発者に転送します。

    データベースにオブジェクトが含まれていない場合は、この手順をスキップします。

    説明

    データベースの SPM を有効にする場合は、データベースで SQL ステートメントが実行されていないことを確認してください。そうしないと、SPM を有効にできず、ビジネスに影響を与える可能性があります。

    spm_migrate 関数は、一度に多数のオブジェクトの所有権を転送する場合があります。これは PostgreSQL によって制限される可能性があります。 spm_migrate 関数を呼び出して一度に所有権を転送できるオブジェクトの数は、max_locks_per_transaction パラメーターの値以下です。その結果、すべてのオブジェクトの所有権が転送されるまで、spm_migrate 関数を複数回呼び出す必要がある場合があります。 spm_migrate 関数の詳細については、spm_migrate をご参照ください。

  4. ユーザーを作成する。

    ユーザーを承認する前に、Hologres インスタンスにユーザーを作成する必要があります。インスタンス内の既存のユーザーを承認する必要がある場合は、この手順をスキップします。

    • Alibaba Cloud アカウントまたは RAM ユーザー:

      call spm_create_user ('Alibaba Cloud アカウントの UID/Alibaba Mail アドレス/RAM ユーザー'); // Alibaba Mail アドレスを使用してユーザーを作成する場合は、アドレスを二重引用符(")で囲む必要があります。
      call spm_create_user ('Alibaba Cloud アカウントの UID/Alibaba Mail アドレス/RAM ユーザー', '<dbname>_[admin|developer|writer|viewer]'); // ユーザーを作成するときに、対応するユーザーグループにユーザーを追加します。

      上記のステートメントの dbname パラメーターは、現在の Hologres インスタンス上のデータベースの名前を示します。

      たとえば、RAM ユーザー xxx.onaliyun.comtestdb データベースの developer ユーザーグループに追加できます。

      call spm_create_user ('xxx.onaliyun.com', 'testdb_developer');
    • カスタムユーザー:

      create user "BASIC$<user_name>" with password '<password>';
    説明
    • spm_create_user 関数を呼び出して RAM ユーザーを Hologres インスタンスに追加する場合は、RAM ユーザーの UID にプレフィックス p4_ を付け、プレフィックスと UID を二重引用符(")で囲みます(例: "p4_uid")。

    • カスタムアカウントを使用する場合、ユーザー名は admindeveloperwriterviewer、または all_users で終わることはできません。

  5. ユーザーをユーザーグループに追加する。

    Hologres インスタンスにユーザーを作成した後、ユーザーをデータベースのユーザーグループに追加して、ユーザーを承認します。 RAM ユーザーを承認した後、開発ツールを使用して現在のデータベースに接続し、RAM ユーザーとしてデータベースを開発できます。ユーザーを作成したときにユーザーのユーザーグループを指定した場合は、この手順をスキップします。 spm_grant 関数の詳細については、spm_grant をご参照ください。

    次のステートメントでは、{dbname}_[admin|developer|writer|viewer] 句を使用して、現在のデータベースのユーザーグループを指定します。詳細については、概要をご参照ください。

    
    call spm_grant('{dbname}_[admin|developer|writer|viewer]', 'Alibaba Cloud アカウントの UID/Alibaba Mail アドレス/RAM ユーザー'); // ユーザーをユーザーグループに追加します。

    次のステートメントのいずれかを実行して、ユーザーを指定されたユーザーグループに追加できます。

    // データベースの <db>_admin ユーザーグループにユーザーを追加します。
    call spm_grant('mydb_admin', 'p4_564306222995xxx'); // UID が 564306222995xxx の RAM ユーザーを mydb_admin ユーザーグループに追加します。
    call spm_grant('mydb_admin', '197006222995xxx'); // Alibaba Cloud アカウントの UID が 197006222995xxx のユーザーを mydb_admin ユーザーグループに追加します。
    call spm_grant('mydb_admin', 'ALIYUN$xxx'); // Alibaba Mail アドレスが xxx@aliyun.com のユーザーを mydb_admin ユーザーグループに追加します。
    
    // データベースの <db>_developer ユーザーグループにユーザーを追加します。
    call spm_grant('mydb_developer', 'p4_564306222995xxx'); // UID が 564306222995xxx の RAM ユーザーを mydb_developer ユーザーグループに追加します。
    call spm_grant('mydb_developer', '197006222995xxx'); // Alibaba Cloud アカウントの UID が 197006222995xxx のユーザーを mydb_developer ユーザーグループに追加します。
    call spm_grant('mydb_developer', 'RAM$mainaccount:subuser');// mainaccount という名前の Alibaba Cloud アカウントの subuser という名前の RAM ユーザーを mydb_developer ユーザーグループに追加します。
    
    // データベースの <db>_viewer ユーザーグループにユーザーを追加します。
    call spm_grant('"MYDB_viewer"', 'p4_564306222995xxx'); // UID が 564306222995xxx の RAM ユーザーを MYDB_viewer ユーザーグループに追加します。
    call spm_grant('"MYDB_viewer"', '197006222995xxx'); // Alibaba Cloud アカウントの UID が 197006222995xxx のユーザーを MYDB_viewer ユーザーグループに追加します。
    call spm_grant('mydb_viewer', '"xxx@aliyun.com"'); // Alibaba Mail アドレスが xxx@aliyun.com のユーザーを mydb_viewer ユーザーグループに追加します。

ユーザーグループからユーザーを削除する

Hologres の指定されたデータベースのユーザーグループからユーザーを削除する必要がある場合は、SPM に基づいて次の方法を使用できます。

  • SQL ステートメントを実行してユーザーグループからユーザーを削除する。

    次のステートメントを実行して、データベースのユーザーグループからユーザーを削除できます。 spm_revoke 関数の詳細については、spm_revoke をご参照ください。

    call spm_revoke('<dbname>_[admin|developer|writer|viewer]', 'Alibaba Cloud アカウントの UID/Alibaba Mail アドレス/RAM ユーザー'); // ユーザーグループからユーザーを削除します。
    
    // 例:
    // データベースの <db>_admin ユーザーグループからユーザーを削除します。
    call spm_revoke ('dbname_admin', 'p4_564306222995xxx');// 指定されたデータベースの admin ユーザーグループから、UID が 564306222995xxx の RAM ユーザーを削除します。
    call spm_revoke ('dbname_admin', '197006222995xxx');// 指定されたデータベースの admin ユーザーグループから、Alibaba Cloud アカウントの UID が 197006222995xxx のユーザーを削除します。
    call spm_revoke('dbname_admin', 'xxx@aliyun.com');// 指定されたデータベースの admin ユーザーグループから、Alibaba Mail アドレスが xxx@aliyun.com のユーザーを削除します。
    
    // データベースの <db>_developer ユーザーグループからユーザーを削除します。
    call spm_revoke('mydb_developer', 'RAM$mainaccount:subuser'); // mydb_developer ユーザーグループから、mainaccount という名前の Alibaba Cloud アカウントの subuser という名前の RAM ユーザーを削除します。
    call spm_revoke('mydb_developer', 'p4_564306222995xxx');// mydb_developer ユーザーグループから、UID が 564306222995xxx の RAM ユーザーを削除します。
    
    // データベースの <db>_viewer ユーザーグループからユーザーを削除します。
    call spm_revoke('"MYDB_viewer"', 'p4_564306222995xxx'); // MYDB_viewer ユーザーグループから、UID が 564306222995xxx の RAM ユーザーを削除します。

Hologres インスタンスからユーザーを削除する

次のステートメントを実行して、Hologres インスタンスからユーザーを削除できます。

重要

Hologres インスタンスからユーザーが削除されると、ユーザーはそのインスタンスに対する権限を持たなくなります。注意して進めてください。

DROP ROLE "Alibaba Cloud アカウントの UID/Alibaba Mail アドレス/RAM ユーザー UID"; // Hologres インスタンスからユーザーを削除します。

(オプション) 既存のオブジェクトに対して標準の PostgreSQL 承認モデルから SPM に切り替える

データベースが 標準の PostgreSQL 承認モデル を使用し、データベースにテーブル、ビュー、外部テーブルなどのオブジェクトが含まれている場合は、権限管理を改善するために SPM を有効にできます。 spm_migrate 関数を呼び出して既存のオブジェクトの所有権を SPM に転送するには、次のステートメントを実行します。

call spm_migrate();  // データベース内の既存のオブジェクトの所有権を、SPM で指定された開発者に転送します。
説明

データベースの SPM を有効にする場合は、データベースで SQL ステートメントが実行されていないことを確認してください。そうしないと、SPM を有効にできず、ビジネスに影響を与える可能性があります。

spm_migrate 関数は、一度に多数のオブジェクトの所有権を転送する場合があります。ただし、spm_migrate 関数を呼び出して一度に所有権を転送できるオブジェクトの数は、max_locks_per_transaction パラメーターの値以下です。その結果、すべてのオブジェクトの所有権が転送されるまで、spm_migrate 関数を複数回呼び出す必要がある場合があります。

SPM を無効にする

  1. SPM を無効にする。

    スーパーユーザーは、次のステートメントを実行して、データベースの SPM を無効にできます。 spm_disable 関数の詳細については、spm_disable をご参照ください。

    call spm_disable();

    スーパーユーザーがデータベースの SPM を無効にしても、データベースのユーザーグループは削除されません。ユーザーグループのユーザーの権限については、SPM を管理する関数をご参照ください。

  2. データベースのユーザーグループを削除する。

    SPM を無効にした後、次のいずれかの場合に spm_cleanup 関数を呼び出して、データベースのユーザーグループを削除できます。

    説明

    ほとんどの場合、ユーザー管理を容易にするためにユーザーグループを保持することをお勧めします。

    • ケース 1: 既存のデータベースのユーザーグループを削除する

      ユーザーグループを削除するがデータベースは保持するには、スーパーユーザーとして次のステートメントを実行します。 spm_cleanup 関数の詳細については、spm_cleanup をご参照ください。

      call spm_cleanup('{dbname}');
      説明

      spm_cleanup 関数を呼び出す場合は、データベースで SQL ステートメントが実行されていないことを確認してください。そうしないと、関数が失敗し、ビジネスに影響を与える可能性があります。

      spm_cleanup 関数は、一度に多数のビジネスオブジェクトの所有権を転送する場合があります。ただし、spm_cleanup 関数を呼び出して一度に所有権を転送できるオブジェクトの数は、max_locks_per_transaction パラメーターの値以下です。その結果、すべてのオブジェクトの所有権が転送され、データベースのすべてのユーザーグループが削除されるまで、spm_cleanup 関数を複数回呼び出す必要がある場合があります。

    • ケース 2: 削除されたデータベースのユーザーグループを削除する

      削除されたデータベースのユーザーグループを削除するには、スーパーユーザーとして postgres などの別のデータベースで次のステートメントを実行します。

      call spm_cleanup('mydb');

SPM を無効にする場合は、次の項目に注意してください。

  • スーパーユーザーのみがデータベースの SPM を無効にできます。

  • SPM を無効にした後、PUBLIC グループには、データベースのパブリックスキーマに対する USAGE 権限と CREATE 権限が付与されます。

  • SPM を無効にした後、PUBLIC グループには、データベースに対する CONNECT 権限と TEMPORARY 権限が付与されます。

  • SPM を無効にした後、PUBLIC グループには、データベースの関数とプロシージャに対する EXECUTE 権限が付与されます。

  • SPM を無効にした後、PUBLIC グループには、データベースの 言語とデータ型(ドメインを含む) に対する USAGE 権限が付与されます。

  • SPM を無効にした後、PUBLIC グループには、上記のオブジェクト以外のオブジェクトに対する権限はありません。たとえば、PUBLIC グループには、テーブル、ビュー、マテリアライズドビュー、テーブル列、シーケンス、外部データラッパー、外部サーバー、またはスキーマ(パブリックスキーマを除く)に対する権限はありません。

  • SPM を無効にした後、<db>_admin、<db>_developer、<db>_writer、および <db>_viewer ユーザーグループには、次の権限があります。

    • <db>_admin: 既存のオブジェクトに対して取得した権限を保持し、新しいオブジェクトに対する権限はありません。

    • <db>_developer: 既存のオブジェクトに対して取得した権限を保持し、新しいオブジェクトに対する権限はありません。

    • <db>_writer: 既存のオブジェクトに対して取得した権限を保持し、新しいオブジェクトに対する権限はありません。

    • <db>_viewer: 既存のオブジェクトに対して取得した権限を保持し、新しいオブジェクトに対する権限はありません。

SPM を再度有効にする

データベースの SPM を有効にしましたが、既存のオブジェクトに対して標準の PostgreSQL 承認モデルに切り替えました。 SPM を再度有効にする必要がある場合は、次のステートメントを実行します。

call spm_enable (); // 現在のデータベースの SPM を有効にします。
call spm_migrate(); // データベース内の既存のオブジェクトの所有権を、SPM で指定された開発者に転送します。
説明

データベースの SPM を有効にする場合は、データベースで SQL ステートメントが実行されていないことを確認してください。そうしないと、SPM を有効にできず、ビジネスに影響を与える可能性があります。

spm_migrate 関数は、一度に多数のオブジェクトの所有権を転送する場合があります。ただし、spm_migrate 関数を呼び出して一度に所有権を転送できるオブジェクトの数は、max_locks_per_transaction パラメーターの値以下です。その結果、すべてのオブジェクトの所有権が転送されるまで、spm_migrate 関数を複数回呼び出す必要がある場合があります。