Hologres 開発中に権限の問題が原因でエラーが発生することがあります。本トピックでは、Hologres インスタンスで発生する一般的な権限エラーの解決方法を説明します。
よくある質問
Hologres インスタンス内で操作を行うには、必要な開発権限が必要です。以下のリンクをクリックして、一般的な権限エラーの解決方法をご確認ください。
適切な Hologres 権限モデルの選択方法
Hologres では、標準 PostgreSQL 権限モデル、簡易権限モデル、スキーマレベルの簡易権限モデル (SLPM) の 3 種類の権限モデルを提供しています。本トピックでは、それぞれの利用シーンに基づき、最も適した権限モデルを選択するためのガイドを提供します。
標準 PostgreSQL 権限モデルは、PostgreSQL のネイティブな権限モデルです。PostgreSQL 及びその権限管理に精通している場合、このモデルを使用することで学習コストを抑えることができます。テーブル単位での詳細な権限管理が必要であり、各テーブルおよびユーザーに対して個別に権限の付与・取消しを行う必要がある場合は、このモデルを使用してください。
簡易権限モデル (SPM) は、データベース単位でシンプルに権限を管理するモデルです。データベースにアクセスする必要のあるすべてのユーザーはユーザーグループに追加する必要があります。各ユーザーグループは、データベース内の任意のスキーマにあるオブジェクトに対して特定のアクセス権限を持ちます。開発時にスキーマをほとんど使用しない場合や、スキーマをフォルダのようにテーブルオブジェクトを分類する目的でのみ使用し、スキーマ単位での権限隔離が不要な場合は、SPM を使用できます。
スキーマレベルの簡易権限モデル (SLPM) は、各スキーマに独自の開発者、ライター、および視聴者のユーザーグループを提供します。スキーマレベルのユーザーとテーブルの権限隔離に大きく依存している場合は、SLPM を使用できます。
Hologres インスタンス操作時のエラー:ロール "RAM$xxx" が存在しません
症状
開発ツールでインスタンスに接続後、クエリなどの操作を実行すると、`role "RAM$xxx" does not exist` というエラーが表示されます。
原因
現在の Resource Access Management (RAM) ユーザーがインスタンスに追加されていません。
解決方法
現在の RAM ユーザーに対して、インスタンス上で Superuser などの必要な権限を付与してください。権限付与の詳細については、「RAM ユーザーへのインスタンス開発権限の付与」をご参照ください。
インスタンス接続時のエラー:ユーザー "xxx" のパスワード認証に失敗しました
症状
開発ツールを使用してインスタンスに接続すると、`password authentication failed for user "xxx"` というエラーが表示されます。
原因
AccessKey を使用してインスタンスにログインしている場合、このエラーは、現在のユーザーが Hologres インスタンス内に存在しないか、AccessKey が誤っているか無効になっていることを示します。
カスタムアカウント (BASIC アカウント) を使用してインスタンスにログインしている場合、このエラーは、現在のカスタムアカウントが Hologres インスタンス内に存在しないか、パスワードが誤っていることを示します。
解決方法
AccessKey を使用してインスタンスにログインする場合は、以下の項目を順に確認してください。
現在のユーザーがインスタンス内に存在するか確認します。ユーザーが存在しない場合は、ユーザーを追加してください。詳細については、「ユーザー管理」をご参照ください。
AccessKey ID および AccessKey Secret が正しいかどうか、および無効になっていないか確認します。
カスタムアカウント (BASIC アカウント) を使用してインスタンスにログインする場合は、以下の項目を順に確認してください。
現在のカスタムアカウントがインスタンス内に存在するか確認します。アカウントが存在しない場合は、アカウントを追加してください。詳細については、「ユーザー管理」をご参照ください。
カスタムアカウントのパスワードが正しいかどうか確認します。
テーブルクエリ時のエラー:テーブル xxxx へのアクセスが拒否されました
症状
インスタンス内でクエリなどの操作を実行すると、`Execution failed: ERROR: permission denied for table xxxx` というエラーが表示されます。
原因
現在のアカウントに当該テーブルを参照する権限がありません。
解決方法
解決方法は使用している権限モデルによって異なります。
標準 PostgreSQL 権限モデル:次のコマンドを実行してユーザーに権限を付与します。コマンド中の `p4_UID` は RAM ユーザーの情報を指定します。標準 PostgreSQL 権限モデルの詳細については、「標準 PostgreSQL 権限モデル」をご参照ください。
grant select on table tablename to "p4_UID";簡易権限モデル:現在のユーザーをビューアーユーザーグループ、またはそれ以上の権限を持つユーザーグループに追加します。詳細については、「簡易権限モデルの使用」をご参照ください。
Hologres インスタンス操作時のエラー:データベース "xxx" へのアクセスが拒否されました。詳細:ユーザーに CONNECT 権限がありません
症状
開発ツールでインスタンスに接続後、クエリなどの操作を実行すると、`FATAL: permission denied for database "xxx" detail: user does not have CONNECT privilege` というエラーが表示されます。
原因
現在のアカウントはインスタンス内に作成されていますが、インスタンスに対する開発権限が付与されていません。
解決方法
現在のユーザーに対して、インスタンス上で Superuser などの必要な権限を付与してください。権限付与の詳細については、「RAM ユーザーへのインスタンス開発権限の付与」をご参照ください。
call spm_enable() コマンド使用時のエラー:ロールが競合しているため
症状
エキスパートモードで
call spm_enable()を実行すると、ロール競合により同様のエラーが返されます。原因
このエラーは、現在のデータベースで以前に簡易権限モデルが有効化されており、残留情報が残っているために発生します。
解決方法
call spm_enable ('t');コマンドを実行してモデルを有効化できます。
権限付与時のエラー:現在のデータベースは簡易権限モードではありません
症状
権限付与操作を実行すると、`current database is NOT in simple privilege mode` というエラーが表示されます。
原因
現在のデータベースで簡易権限モデルが有効化されていません。
解決方法
show hg_experimental_enable_spm;コマンドを実行して、簡易権限モデルが無効化されているか確認します。次のコマンドを使用して、現在のデータベースで簡易権限モデルを有効化します。
-- 現在の DB で簡易権限モデルを有効化します。 call spm_enable ('t'); -- DB 内の既存オブジェクトの所有者を developer ロールに変更し、SPM で管理できるようにします。 call spm_migrate ();call spm_enable ('t');コマンドの `t` は、call spm_disableコマンドを実行した後でも、元のシステムロールとその権限を削除せずに保持することを指定します。後で `t` を指定せずにspm_enable()コマンドを実行すると、ロール競合エラーが発生し、モデルを有効化できなくなります。spm_enable ('t')コマンドはこの競合を無視し、既存のシステムロールを再利用します。
テーブル操作時のエラー:テーブル xxxx のオーナーである必要があります
症状
インスタンス内で操作を実行すると、`must be the owner of table xxxx` というエラーが表示されます。
原因
現在の RAM ユーザーはテーブルのオーナーではないため、子パーティションの作成やテーブルの削除ができません。
解決方法
解決方法は使用している権限モデルによって異なります。
標準 PostgreSQL 権限モデル:次のコマンドを実行して、現在のアカウントにテーブルの所有権を付与します。コマンド中の `p4_UID` は RAM ユーザーの情報を指定します。標準 PostgreSQL 権限モデルの詳細については、「標準 PostgreSQL 権限モデル」をご参照ください。
alter table tablename owner to "p4_UID";簡易権限モデル:現在のユーザーを開発者ユーザーグループ、またはそれ以上の権限を持つユーザーグループに追加します。詳細については、「簡易権限モデルの使用」をご参照ください。
スキーマをまたいで作成されたビューのクエリ時のエラー:テーブル xxx へのアクセスが拒否されました
原因
インスタンスでスキーマレベルの簡易権限モデル (SLPM)が有効化されています。SLPM はスキーマをまたいだビューの作成をサポートしていません。
解決方法
SLPM でスキーマをまたいでビューを作成していないか確認してください。
SQL 実行時のエラー:スキーマ xxx へのアクセスが拒否されました
原因
現在のユーザーにスキーマに対する権限がないため、クエリが失敗します。
解決方法
現在のユーザーの権限モデルを確認し、適切な解決方法を選択してください。
SPM または SLPM を使用している場合は、クエリ実行のためにユーザーをビューアーユーザーグループ、またはそれ以上の権限を持つユーザーグループに追加します。テーブル作成時に発生するエラーを解決するには、ユーザーを開発者ユーザーグループ、またはそれ以上の権限を持つユーザーグループに追加します。詳細については、「SPM 権限付与」および「SLPM 権限付与」をご参照ください。
標準 PostgreSQL 権限モデルを使用している場合は、ユーザーにスキーマに対するクエリ権限を明示的に付与する必要があります。必要な権限をユーザーに付与してください。詳細については、「標準 PostgreSQL 権限モデル」をご参照ください。スキーマに対するクエリ権限を付与するには、次のコマンドを使用します。
-- スキーマ内のすべてのテーブルを表示するための USAGE 権限をスキーマに付与します。 GRANT USAGE ON SCHEMA <schema_name> TO "Alibaba Cloud account/email"; -- スキーマ内にテーブルを作成するための CREATE 権限をスキーマに付与します。 GRANT CREATE ON SCHEMA <schema_name> TO "Alibaba Cloud account/email";
SQL 実行時のエラー:簡易権限モードでは ALTER TABLE xxx はサポートされていません
エラー
SQL ステートメントを実行すると、`ALTER TABLE xxx is not supported in Simple Privilege Mode` というエラーが表示されます。
原因
このエラーは、現在のデータベースで簡易権限モデルが有効化されているため発生します。このモデルでは、ALTER TABLE 操作を直接実行することはサポートされていません。
解決方法
方法 1:簡易権限モデルで必要な権限を付与します。
方法 2:データベースの権限モデルを簡易権限モデルから標準 PostgreSQL 権限モデルに切り替えます。詳細については、「権限モデルの切り替え」をご参照ください。
重要標準 PostgreSQL 権限モデルは権限の粒度が細かく、管理が複雑です。必要がない限り、このモデルへの切り替えは推奨しません。