Amazon Redshift で新しく作成されたオブジェクトへのアクセス許可を付与する方法を教えてください。

所要時間2分
0

ユーザーに対し、新しく作成したオブジェクトに関するアクセス許可拒否エラーが発生しています。スキーマで新しく作成されたオブジェクトにアクセスするために必要なアクセス許可を、ユーザーに付与する方法を教えてください。

簡単な説明

スキーマ内の新しく作成されたオブジェクトにアクセスするユーザーには、オブジェクト所有者またはスーパーユーザーから付与されたアクセス許可が必要です。

ユーザーがスキーマで新しく作成されたオブジェクトにアクセスできない場合、次のエラーが発生する場合があります。

エラー:リレーション 'objectname' でアクセス許可が拒否されました

このエラーは、アクセスが最初に許可されたときにスキーマ内にあるオブジェクトにのみアクセスが許可されている場合に発生します。デフォルトでは、現在のスキーマで作成されたオブジェクトへのアクセスは自動的に許可されません。

この問題を解決するには、ユーザーにアクセス許可を付与するか、グループロールを使用してアクセス許可を付与します。ALTER DEFAULT PRIVILEGES コマンドを使用します。

解決策

スキーマの現在および今後のテーブルにアクセス許可を付与するには、スーパーユーザーでログインし、次の操作を行います。

  1. スキーマを使用するためのアクセスおよび、スキーマに現在置かれたすべてのテーブルに対する SELECT アクセスを許可するには、次のコマンドを実行します。
    注: newtestschema は実際のスキーマの名前に、newtestuser はユーザーの名前に置き換えます。

    grant usage on schema newtestschema to newtestuser;
    grant select on all tables in schema newtestschema to newtestuser;
  2. スキーマに今後作成されるテーブルに対する SELECT アクセス許可をユーザーに付与するには、次のコマンドを実行します。
    注: awsuser は、今後スキーマにオブジェクトを作成する際に使用するユーザー名に置き換えます。次に、** newtestschema** をスキーマ名に、newtestuser を今後のオブジェクトにアクセスする必要があるユーザー名に置き換えます。

    alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;

    注: デフォルトのアクセス許可は新しいオブジェクトにのみ適用されます。ALTER DEFAULT PRIVILEGES コマンドを実行しても、既存のオブジェクトに対するアクセス許可は変更されません。

  3. デフォルトのアクセス許可がユーザーに付与されたことを確認するには、スーパーユーザーでログインし、次のクエリを実行します。

    select * from svv_default_privileges where grantee_name = 'newtestuser';
    select * from svv_default_privileges where schema_name = 'newtestschema';
    select * from svv_default_privileges where grantee_type = 'role';

    ユーザーに直接付与されたアクセス許可を確認するには、スーパーユーザーでログインし、次のクエリを実行します。

    SELECT * FROM svv_relation_privileges where identity_name = 'newtestuser';

解決策の例

次の例はこの設定から始まります。

  • スーパーユーザーではない newtestuser というユーザー。
  • newtestschema というスキーマ。スキーマには、1 件の newtesttable1 というテーブルがあり、何件かのレコードが含まれます。

スキーマ newtestschema および、そのスキーマに現在置かれたすべてのテーブルに対するアクセス許可を、awsuser というスーパーユーザーが newtestuser に 付与します。awsuser は次のコマンド例を実行し、アクセス許可を付与します。

grant usage on schema newtestschema to newtestuser;
grant select on all tables in schema newtestschema to newtestuser;

このコマンドは、newtestschema にある現在のテーブルへの SELECT アクセス許可を newtestuser に付与します。現在、newtestschema には newtesttable1 のみがあります。したがって、newtestusernewtesttable1 にアクセスすることができます。

次に、awsusernewtestschemanewtesttable2 という別のテーブルを作成します。newtestusernewtestschema.newtesttable2 テーブルで SELECT クエリを実行すると、次のエラーが発生します。

ERROR: permission denied for relation newtesttable2.

このエラーを解決するために、awsuser が次の手順を実行します。

  1. newtesttable2 テーブルへのアクセスを許可するために、awsuser が次のコマンド例を実行します。

    grant select on table newtestschema.newtesttable2 to newtestuser;
  2. awsuser が今後 newtestschema に作成したテーブルに newtestuser がアクセスできるようにするために、awsuser が次のコマンド例を実行します。

    alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;

    完了すると、awsusernewtestschemanewtesttable3 を作成した場合に、newtestusernewtesttable3SELECT を実行するためのアクセス許可が付与されるようになります。

  3. newtestuser にデフォルトのアクセス許可が付与されていることを確認するには、awsuser は次のクエリを実行します。

    select * from svv_default_privileges where grantee_name = 'newtestuser';
    select * from svv_default_privileges where schema_name = 'newtestschema';
    select * from svv_default_privileges where grantee_type = 'role';

    newtestuser に直接付与されたアクセス許可を確認するには、awsuser は次のクエリを実行します。

    SELECT * from svv_relation_privileges where identity_name = 'newtestuser';

    出力は、awsusernewtestschema に作成したすべての新しいテーブルに対し、awsusernewtestuserSELECT アクセス許可を付与していることを示しています。

    schema_name | object_type | owner_id | owner_name | owner_type | privilege_type | grantee_id | grantee_name | grantee_type | admin_option
    newtestschema | RELATION | 100 | awsuser | user | SELECT | 101 | newtestuser | user | FALSE

関連情報

PG_DEFAULT_ACL

AWS公式
AWS公式更新しました 3ヶ月前
コメントはありません