このトピックでは、SQL ステートメントを実行して Hologres でスキーマレベルの権限モデル (SLPM) を使用する方法について説明します。
制限事項
SLPM は、スキーマに対する権限を厳密に管理します。このモデルを使用して権限を付与する場合、次の点に注意してください。
権限はスキーマ間で共有されません。 ビューまたはルールを作成するときに異なるスキーマにある複数のテーブルを参照する場合、[作成されたビューまたはルールにはアクセスできません。] この場合、エラーメッセージ
ERROR: permission denied for table
が表示されます。 SLPM が有効になっているデータベースでは、異なるスキーマにあるテーブルを使用してビューまたはルールを作成しないことをお勧めします。 スキーマをまたいでビューを作成する方法の詳細については、このトピックのSLPM を使用してスキーマをまたいでビューを作成する (ベータ)をご参照ください。SLPM を有効にした後、特定の権限のみを付与できます。具体的な権限の詳細については、このトピックの SLPM を使用して権限を付与する をご参照ください。データベースに対して SLPM を有効にした後、次の表に記載されている DDL ステートメントを実行して操作を実行することはできません。DDL ステートメントに対応する SLPM 関数を呼び出して、関連する操作を実行する必要があります。関数の詳細については、SLPM の関数 をご参照ください。
DDL ステートメント
説明
SLPM 関数
alter table owner to xx
データベースに対して SLPM を有効にした後、データベースのスキーマ内のすべてのテーブルの所有権は {db}.{schema}.developer グループのメンバーに転送されます。これらのテーブルの所有権を転送することはできません。
テーブルの所有権は自動的に転送されます。
grant
ユーザーをユーザーグループに追加すると、ユーザーにはユーザーグループの権限が自動的に付与されます。slpm_grant 関数を呼び出して、ユーザーにユーザーグループの権限を付与する必要はありません。
slpm_grant
revoke
slpm_revoke 関数を呼び出して、ユーザーから特定の権限を取り消すことはできません。代わりに、特定のユーザーグループからユーザーを削除して、ユーザーから特定の権限を取り消すことができます。
slpm_revoke
alter default privileges
標準の PostgreSQL 認可モデルでは、既存のテーブルとオブジェクトに対する権限のみをユーザーに付与できます。今後作成されるオブジェクトとテーブルを管理するには、必要な権限を再度付与する必要があります。SLPM では、ユーザーをユーザーグループに追加することで、指定したタイプのすべてのテーブルまたはオブジェクト (今後作成されるこれらのタイプのオブジェクトとテーブルを含む) に対する必要な権限をユーザーに付与できます。
ユーザーがユーザーグループに追加されると、必要な権限がユーザーに付与されます。
create/drop/alter/rename default user groups
SLPM を有効にすると、{db}.admin、{db}.{schema}.developer、{db}.{schema}.writer、および {db}.{schema}.viewer ユーザーグループがシステムによってデフォルトで生成されます。スーパーユーザーを含むすべてのユーザーは、ユーザーグループを作成、変更、または削除できません。
該当なし。
rename schema
スキーマの名前を変更するには、データベースで
slpm_rename_schema
関数を呼び出す必要がありますが、alter rename schema
文は実行しないでください。slpm_rename_schema
rename database
データベースの名前を変更するには、
slpm_rename_database
関数を呼び出す必要がありますが、alter rename database
文は実行しないでください。slpm_rename_database
drop database
データベースを削除するには、
drop database
文を実行し、slpm_cleanup('<dbname>')
関数を呼び出してデフォルトユーザーを削除する必要があります。データベースを削除するには、
drop database
文を実行し、slpm_cleanup('<dbname>')
関数を呼び出してデフォルトユーザーを削除する必要があります。Hologres V1.3.36 以降でのみ、スキーマをまたいでビューを作成できます。Hologres インスタンスのバージョンが V1.3.36 より前の場合、Hologres コンソールで Hologres インスタンスを手動でアップグレードするか、Hologres DingTalk グループに参加してインスタンスのアップグレードを申請してください。Hologres インスタンスを手動でアップグレードする方法の詳細については、インスタンスのアップグレード をご参照ください。Hologres DingTalk グループへの参加方法の詳細については、Hologres のオンラインサポートを受ける をご参照ください。
SLPM を使用して権限を付与する
開発ツールを使用して Hologres インスタンスに接続した後、SQL ステートメントを実行して SLPM を有効にし、ユーザーに権限を付与できます。このようにして、ユーザーにはスキーマに対する必要な権限が付与されます。
関数呼び出しを有効にします。
SLPM を有効にする前に、次のステートメントを実行して関数呼び出しを有効にする必要があります。この例では、create extension ステートメントはデータベースで 1 回だけ実行されます。
create extension slpm;
SLPM を有効にします。
デフォルトでは、SLPM は無効になっています。スーパーユーザーとして次のステートメントを実行して、データベースに対して SLPM を有効にする必要があります。データベースに対して SLPM を有効にする場合は、データベースで SQL ステートメントが実行されていないことを確認してください。そうでない場合、SLPM を有効にすることができず、ビジネスに影響を与える可能性があります。
call slpm_enable (); // 現在のデータベースに対して SLPM を有効にします。
オプション。 既存のオブジェクトに対して、標準の PostgreSQL 認可モデルから SLPM に切り替えます。
次の手順を実行して、権限モデルを照会できます。
Hologres コンソール にログオンします。 左側のナビゲーションウィンドウで、[HoloWeb に移動] をクリックします。
HoloWeb ページで、[セキュリティセンター] をクリックし、[データベース認証] ページで使用されている権限モデルを表示します。
データベースが標準の PostgreSQL 認証モデルを使用し、テーブル、ビュー、外部テーブルなどのオブジェクトが含まれている場合、slpm_migrate 関数を呼び出して、これらのオブジェクトについて標準の PostgreSQL 認証モデルから SLPM に切り替えることができます。
call slpm_migrate (); // データベース内の既存のオブジェクトの所有権を、SLPM で指定された開発者に転送します。
これらのオブジェクトに対して標準の PostgreSQL 認可モデルから SLPM に切り替える場合は、次の情報に注意してください。
デフォルトでは、slpm_migrate 関数を呼び出すたびに、最大 64 個のオブジェクトの所有権が SLPM で指定された開発者に転送されます。この関数では batch_size パラメーターを変更できます。オブジェクトの数が 64 を超える場合は、すべてのオブジェクトの所有権が転送されるまで slpm_migrate 関数を繰り返し呼び出す必要があります。この関数の詳細については、slpm_migrate をご参照ください。
Hologres インスタンスにユーザーを作成します。
ユーザーに権限を付与する前に、現在の Hologres インスタンスにユーザーを作成する必要があります。インスタンス内の既存のユーザーに権限を付与する場合は、この手順をスキップします。
次のステートメントでは、{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer] 句を使用して、現在のデータベースのユーザーグループを指定します。ユーザーグループの詳細については、概要 をご参照ください。
call slpm_create_user ('Alibaba Cloud アカウント ID/Alibaba Cloud メールアドレス/RAM ユーザー ID'); // Hologres インスタンスにユーザーを作成します。Alibaba Cloud メールアドレスは二重引用符 (") で囲む必要があります。 call slpm_create_user ('Alibaba Cloud アカウント ID/Alibaba Cloud メールアドレス/RAM ユーザー ID', '{dbname}.[admin|{schemaname}.developer|{schemaname}.writer|{schemaname}.viewer]'); // Hologres インスタンスにユーザーを作成し、データベースのユーザーグループにユーザーを追加します。
ユーザーをユーザーグループに追加します。
Hologres インスタンスにユーザーを作成した後、ユーザーに権限を付与するには、データベースのユーザーグループにユーザーを追加する必要があります。ユーザーを作成するときにユーザーのユーザーグループを指定している場合は、この手順をスキップします。
次のステートメントでは、{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 ユーザー ID'); // ユーザーをユーザーグループに追加します。
次のステートメントのいずれかを実行して、ユーザーを指定したユーザーグループに追加できます。
// データベースの {db}.admin ユーザーグループにユーザーを追加します。 call slpm_grant ('mydb.admin', '197006222995xxx'); // UID が 197006222995xxx のユーザーを mydb.admin ユーザーグループに追加します。 call slpm_grant ('mydb.admin', 'ALIYUN$xxx'); // Alibaba Cloud メールアドレスが xxx@aliyun.com のユーザーを mydb.admin ユーザーグループに追加します。 // データベースの {db}.{schema}.developer ユーザーグループにユーザーを追加します。 call slpm_grant ('mydb.public.developer', '197006222995xxx'); // UID が 197006222995xxx のユーザーを mydb.public.developer ユーザーグループに追加します。 call slpm_grant ('mydb.public.developer', 'RAM$mainaccount:subuser'); // mainaccount という名前の Alibaba Cloud アカウントの subuser という名前の RAM ユーザーを mydb.public.developer ユーザーグループに追加します。 // データベースの {db}.{schema}.viewer ユーザーグループにユーザーを追加します。 call slpm_grant ('"MYDB.lisa.viewer"', '197006222995xxx'); // UID が 197006222995xxx のユーザーを MYDB.lisa.viewer ユーザーグループに追加します。 call slpm_grant ('mydb.lisa.viewer', '"xxx@aliyun.com"'); // Alibaba Cloud メールアドレスが xxx@aliyun.com のユーザーを mydb.lisa.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 ユーザー ID'); // 特定のユーザーから権限を取り消します。
次のステートメントのいずれかを実行して、指定したユーザーグループからユーザーを削除できます。
// データベースの {db}.admin ユーザーグループからユーザーを削除します。
call slpm_revoke ('dbname.admin', 'p4_564306222995xxx'); // UID が 564306222995xxx の RAM ユーザーを {db}.admin ユーザーグループから削除します。
call slpm_revoke ('dbname.admin', '197006222995xxx'); // Alibaba Cloud アカウント ID が 197006222995xxx のユーザーを {db}.admin ユーザーグループから削除します。
call slpm_revoke ('dbname.admin', '"xxx@aliyun.com"');
// データベースの {db}.{schema}.developer ユーザーグループからユーザーを削除します。
call slpm_revoke ('mydb.lisa.developer', 'RAM$mainaccount:subuser'); // subuser という名前の RAM ユーザーを mydb.lisa.developer ユーザーグループから削除します。
call slpm_revoke ('mydb.public.developer', 'p4_564306222995xxx'); // UID が 564306222995xxx の RAM ユーザーを mydb.public.developer ユーザーグループから削除します。
// データベースの {db}.{schema}.viewer ユーザーグループからユーザーを削除します。
call slpm_revoke ('"MYDB.SCHEMA1.viewer"', 'p4_564306222995xxx'); // UID が 564306222995xxx の RAM ユーザーを MYDB.SCHEMA1.viewer ユーザーグループから削除します。
ユーザーを削除する
ビジネス要件に基づいてユーザーを削除できます。ユーザーが Hologres インスタンスから削除されると、ユーザーにはインスタンスに対する権限がなくなります。注意して進めてください。
DROP ROLE "Alibaba Cloud アカウント ID/Alibaba Cloud メールアドレス/RAM ユーザー ID"; // Hologres インスタンスからユーザーを削除します。
SLPM を無効にする
SLPM が不要になった場合は、次の手順を実行して無効にすることができます。
SLPM を無効にします。
SLPM が有効になっている場合、スーパーユーザーは次のステートメントを実行して、データベースに対して SLPM を無効にすることができます。スーパーユーザーがデータベースに対して SLPM を無効にしても、データベースのユーザーグループは削除されません。ユーザーグループのメンバーの権限の詳細については、SLPM の関数 をご参照ください。
call slpm_disable ();
SLPM を無効にする場合は、次の点に注意してください。
スーパーユーザーのみがデータベースに対して SLPM を無効にすることができます。
SLPM を無効にすると、PUBLIC グループには、データベースのパブリックスキーマに対する USAGE 権限と CREATE 権限、データベースに対する CONNECT 権限と TEMPORARY 権限、データベースの関数とプロシージャに対する EXECUTE 権限、およびデータベースの言語とデータ型 (ドメインを含む) に対する USAGE 権限が付与されます。
SLPM を無効にした後、PUBLIC グループには、上記のオブジェクト以外のオブジェクトに対する権限はありません。たとえば、PUBLIC グループには、テーブル、ビュー、マテリアライズドビュー、テーブル列、シーケンス、外部データラッパー、外部サーバー、またはスキーマに対する権限はありません。パブリックスキーマは除外されます。ビジネス要件に基づいてこれらの権限を取得するには、スーパーユーザーに連絡してください。
SLPM を無効にした後、{db}.admin、{db}.{schemaname}.developer、{db}.{schemaname}.writer、および {db}.{schema}.viewer ユーザーグループのメンバーは、既存のオブジェクトに対する取得済みの権限を保持しますが、新しいオブジェクトに対する権限はありません。
データベースのユーザーグループを削除します。ユーザー管理を容易にするために、ユーザーグループを保持することをお勧めします。
SLPM を無効にした後、次のいずれかの場合に slpm_cleanup 関数を呼び出して、データベースのユーザーグループを削除できます。
ケース 1: 既存のデータベースのユーザーグループを削除する
ユーザーグループを削除するがデータベースは保持する場合は、スーパーユーザーとして次のステートメントを実行します。
call slpm_cleanup ( '<dbname>' );
説明slpm_cleanup 関数を呼び出す場合は、データベースで SQL ステートメントが実行されていないことを確認してください。そうでない場合、ユーザーグループを削除できず、ビジネスに影響を与える可能性があります。
slpm_cleanup 関数は、オブジェクトの所有権を現在のユーザーに転送するために使用されます。ただし、この関数を使用して一度に転送できるオブジェクトの所有権は最大 64 個です。この関数では batch_size パラメーターを変更できます。そのため、すべてのオブジェクトの所有権が転送され、データベースのすべてのユーザーグループが削除されるまで、slpm_cleanup 関数を繰り返し呼び出す必要がある場合があります。この関数を 5 回以上繰り返し呼び出さないことをお勧めします。この関数の詳細については、slpm_cleanup をご参照ください。
ケース 2: 削除されたデータベースのユーザーグループを削除する
削除されたデータベースのユーザーグループを削除するには、スーパーユーザーとして別のデータベースで次のステートメントを実行します。この例では、postgres データベースでステートメントを実行します。
call slpm_cleanup ( 'mydb' );
SLPM を再度有効にする
次の操作を実行して、データベースに対して SLPM を再度有効にすることができます。
ユーザーから権限を取り消します。
SLPM を有効にする前に、次のステートメントを実行して、データベース内のユーザーのすべての権限を取り消すことをお勧めします。
call slpm_cleanup ( '<dbname>' );
SLPM を再度有効にします。
ユーザーの権限が取り消されたら、次のステートメントを実行して SLPM を再度有効にします。
-- 復旧モードで SLPM を有効にします。 call slpm_enable ('t'); -- データベース内の既存のオブジェクトの所有権を、SLPM で指定された開発者に転送します。このステートメントを実行する必要があります。 call slpm_migrate ();
ユーザーに権限を付与します。
SLPM を再度有効にした後、Hologres コンソールで、または SQL ステートメントを実行して、ユーザーに権限を付与できます。詳細については、データベースを管理する の「ユーザーに権限を付与する」セクションをご参照ください。
SLPM を使用してスキーマをまたいでビューを作成する (ベータ)
Hologres V1.3.36 以降でのみ、スキーマをまたいでビューを作成できます。Hologres インスタンスのバージョンが V1.3.36 より前の場合、Hologres コンソールで Hologres インスタンスを手動でアップグレードするか、Hologres DingTalk グループに参加してインスタンスのアップグレードを申請してください。Hologres インスタンスを手動でアップグレードする方法の詳細については、インスタンスのアップグレード をご参照ください。Hologres DingTalk グループへの参加方法の詳細については、Hologres のオンラインサポートを受ける をご参照ください。
シナリオ
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
という名前のスキーマに対するviewer
以上のユーザーグループの権限のみが付与されている必要があります。スキーマをまたいでビュー作成機能を有効にした後、作成されたビューの所有者は、ビューを作成したユーザーです。ビューの所有者のみがビューを変更または削除できます。
たとえば、前のシナリオでは、
ads.customer_total_order_price_view
ビューの所有者はads_dev_user
アカウントです。ads_dev_user
アカウントをデータベースから削除する場合は、次の SQL 文を実行してビューの所有権を転送します。 所有権の転送先アカウントには、ビューで使用されるテーブルのスキーマに対するviewer
以上のユーザーグループの権限と、ビューが属するスキーマに対するdeveloper
権限が付与されていることを確認してください。-- サンプル構文 call slpm_alter_view_owner('ビュー名', 'Alibaba Cloud アカウント ID/Alibaba Cloud メールアドレス/RAM ユーザー ID'); -- 例: 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();
-- すべてのビューの所有権を、ビューが属するスキーマの開発者に転送します。
call slpm_migrate();
上記のステートメントを実行した後、スキーマをまたいで作成されていないビューを照会でき、SLPM ベースの機能が復元され、スキーマをまたいだビューを照会できなくなります。