

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# ロールベースのアクセスコントロール (RBAC)
<a name="t_Roles"></a>

ロールベースのアクセスコントロール (RBAC) を使用して、Amazon Redshift でのデータベース許可を管理することで、Amazon Redshift 内のセキュリティに関する許可の管理を簡略化できます。ユーザーが実行できる操作を、広範な、または詳細なレベルの両方で制御することで、機密データへのアクセスを保護できます。また、通常はスーパーユーザーに制限されるタスクへのユーザーによるアクセスを制御することもできます。異なるロールに異なるアクセス許可を割り当て、それらを異なるユーザーに割り当てることで、ユーザーアクセスをより細かく制御できます。

ロールが割り当てられたユーザーは、そのロールが指定し承認したタスクのみ実行できます。例えば、CREATE TABLE および DROP TABLE 許可を持つロールが割り当てられたユーザーについては、これらのタスクの実行のみが承認されます。作業で必要とするデータに対する各ユーザーアクセスを制御するには、セキュリティに関するさまざまなレベルの許可を、それぞれのユーザーに付与します。

RBAC では、対象となるオブジェクトのタイプに関係なく、ロールの要件に基づいて、最小許可の原則をユーザーに適用します。アクセス許可の付与と取り消しはロールレベルで実行され、個々のデータベースオブジェクトにおいてアクセス許可を更新する必要はありません。

RBAC では、スーパーユーザーのアクセスが必要となるコマンドを実行するための、アクセス許可を持つロールを作成できます。これらの許可を含むロールで承認されているのであれば、ユーザーはこの種類のコマンドを実行できます。同様に、特定のコマンドへのアクセスを制限するロールを作成し、その中で承認されたスーパーユーザーまたはユーザーのいずれかに対して、ロールを割り当てることもできます。

Amazon Redshift RBAC の仕組みについては、以下の動画をご覧ください。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/IhHQ7mZ-tp4/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/IhHQ7mZ-tp4)


# ロール階層
<a name="t_role_hierarchy"></a>

*ロール*とは、ユーザーまたは別のロールに割り当てることができるアクセス許可の集合です。ロールには、システムまたはデータベースへのアクセス許可を割り当てることができます。ユーザーは、割り当てられたロールのアクセス許可を継承します。

RBAC では、ネストされたロールをユーザーに付与できます。ロールは、ユーザーとロールの両方に付与することが可能です。ユーザーにロールを付与すると、このロールに含まれるすべてのアクセス許可が、そのユーザーに対し承認されます。ユーザーにロール r1 を付与するとすれば、r1 が持つ権限がそのユーザーでも承認されます。このユーザーには r1 からのアクセス許可が与えられると同時に、すでに保持していた既存の許可も維持されます。

あるロール (r1) を別のロール (r2) に付与する場合、r1 のすべてのアクセス許可が r2 においても承認されます。さらに、r2 を別のロール (r3) に付与すると、r3 には r1 と r2 の許可を組み合わせた許可が付与されます。このロール階層では、r1 からの許可が r2 に継承されています。Amazon Redshift は、アクセス許可とともに各ロールの認可を伝播します。r1 を r2 に付与し、r2 を r3 に付与すると、3 つのロールのすべてのアクセス許可が r3 において承認されます。したがって、ユーザーに r3 を付与することで、このユーザーには 3 つのロールからのすべてのアクセス許可が付与されます。

Amazon Redshift では、ロールの認可サイクルを作成することはできません。ロールの認可サイクルは、ネストされたロールがロール階層で前の段階にあるロールに割り当てられる場合に発生します。例えば、ここで r3 を r1 に割り当てる場合がこれに相当します。IAM ロールを作成し、ロールの割り当てを管理する方法の詳細については「[RBAC でのロールの管理](r_roles-managing.md)」を参照してください。

# ロールの割り当て
<a name="t_role_assignment"></a>

CREATE ROLE のアクセス許可を持つスーパーユーザーおよび通常のユーザーは、CREATE ROLE ステートメントを使用してロールを作成できます。スーパーユーザーとロールの管理者は、GRANT ROLE ステートメントを使用して、他のユーザーにロールを付与できます。これらのユーザー (管理者) は、REVOKE ROLE ステートメントを使用して他のユーザーが持つロールを取り消したり、DROP ROLE ステートメントを使用してロールを削除したりできます。ロール管理者には、ロール所有者と ADMIN OPTION のアクセス許可を持つロールを付与されたユーザーが含まれます。

ロールの付与と取り消しを行えるのは、スーパーユーザーまたはロールの管理者のみです。1 つまたは複数のロールやユーザーに対して、1 つ以上のロールを付与または取り消すことができます。GRANT ROLE ステートメントで WITH ADMIN OPTION オプションを使用して、付与されたすべてのロールの管理オプションを、その付与のすべての対象者に提供します。

Amazon Redshift は、複数のロールの付与や、複数のユーザーを付与の対象にすることを含め、ロール割り当てのさまざまな組み合わせをサポートしています。WITH ADMIN オプションは、ユーザーにのみ適用され、ロールには適用されません。同様に、付与の対象者からロールと管理としての承認を削除するには、WITH ADMIN OPTION オプションを指定しながら REVOKE ROLE ステートメントを実行します。ADMIN OPTION を指定した場合には、管理としての承認のみがロールから取り消されます。

次の例では、`sample_role2` ロールでの管理としての承認を `user2` から取り消しています。

```
REVOKE ADMIN OPTION FOR sample_role2 FROM user2;
```

IAM ロールを作成し、ロールの割り当てを管理する方法の詳細については「[RBAC でのロールの管理](r_roles-managing.md)」を参照してください。

# Amazon Redshift でのシステム定義のロール
<a name="r_roles-default"></a>

Amazon Redshift には、特定のアクセス許可が定義されたシステム定義のロールがいくつか用意されています。システム固有のロールには `sys:` がプレフィックスされます。適切なアクセス権を持つユーザーのみが、システム定義のロールを変更したり、カスタムなシステム定義のロールを作成したりできます。カスタムなシステム定義のロールでは、`sys:` のプレフィックスを使用することはできません。

次の表に、ロールとそのアクセス許可を一覧でまとめています。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_roles-default.html)

## データ共有のためのシステム定義のロールとユーザー
<a name="r_roles-datashare"></a>

 Amazon Redshift は、データ共有とデータ共有コンシューマーに対応する内部使用を目的としたロールとユーザーを作成します。各内部ロール名とユーザー名には、予約された名前空間プレフィックス `ds:` が付いています。それには以下の形式があります。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_roles-default.html)

 データ共有ロールは、データ共有ごとに作成されます。このロールは、データ共有に現在付与されているすべてのアクセス許可を保持しています。データ共有ユーザーは、データ共有コンシューマーごとに作成されます。このユーザーには、単一のデータ共有ロールへのアクセス許可が付与されます。複数のデータ共有に追加されたコンシューマーでは、データ共有ごとにデータ共有ユーザーが作成されます。

データ共有が適切に機能するには、このようなユーザーとロールが必要です。これらのユーザーとロールは変更または削除することはできません。また、顧客が実行するタスクにアクセスしたり、使用したりすることはできません。このような場合、無視しても問題ありません。データ共有の詳細については、「[Amazon Redshift でのクラスター間のデータの共有](https://docs.aws.amazon.com/redshift/latest/dg/datashare-overview.html)」を参照してください。

**注記**  
`ds:` プレフィックスを使用してユーザー定義のロールまたはユーザーを作成することはできません。

# RBAC でのシステムへのアクセス許可
<a name="r_roles-system-privileges"></a>

以下は、ロールに対して付与または取り消すことができるシステムへのアクセス許可の一覧です。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_roles-system-privileges.html)

# データベースオブジェクトへのアクセス許可
<a name="r_roles-database-privileges"></a>

システムへのアクセス許可とは別に、Amazon Redshift には、データベースオブジェクトへのアクセス許可が含まれており、アクセスのオプションを定義できます。この定義には、テーブルとビューからのデータの読み取り、データの書き込み、テーブルの作成、テーブルの削除など各機能のオプションが含まれます。詳細については、「[GRANT](r_GRANT.md)」を参照してください。

RBAC を使用すると、システムへのアクセス許可による場合と同様に、データベースオブジェクトへのアクセス許可をロールに割り当てることができます。その後、このロールをユーザーに割り当て、そのユーザーでシステムへのアクセスを認可し、データベースへのアクセスを認可できます。

# RBAC での ALTER DEFAULT PRIVILEGES
<a name="r_roles-alter-default-privileges"></a>

指定したユーザーによって今後作成されるオブジェクトに対して、デフォルトで適用するアクセス許可のセットを定義するには、ALTER DEFAULT PRIVILEGES ステートメントを使用します。デフォルトでは、ユーザーは自分のデフォルトのアクセス許可のみ変更できます。RBAC では、ロールに対してデフォルトのアクセス許可を設定できます。詳細については、[ALTER DEFAULT PRIVILEGES](r_ALTER_DEFAULT_PRIVILEGES.md) コマンドを参照してください。

RBAC を使用すると、システムへのアクセス許可と同様に、データベースオブジェクトのアクセス許可をロールに割り当てることができます。その上で、ロールをユーザーに割り当てたり、システムおよび (あるいは) データベースに対するアクセスを許可したりできます。

# RBAC でのロールの使用に関する考慮事項
<a name="r_role-usage-notes"></a>

RBAC データを使用する際には、以下の点を考慮してください。
+ Amazon Redshift では、ロール認証のサイクルは使用できません。r1 を r2 に付与した後に、r2 を r1 に付与することはできません。
+ RBAC は、ネイティブの Amazon Redshift オブジェクトと Amazon Redshift Spectrum テーブルの両方で使用できます。
+ Amazon Redshift の管理者は、RBAC を有効にして使用開始するために、クラスターを最新のメンテナンスパッチにアップグレードします。
+ ロールを作成できるのは、スーパーユーザーと、システムへのアクセス許可 CREATE ROLE を持つユーザーのみです。
+ スーパーユーザーとロールの管理者のみが、ロールを変更または削除できます。
+ ロール名をユーザー名と同じにすることはできません。
+ ロール名に「:/\$1n」などの無効な文字を含めることはできません。
+ ロール名に、PUBLIC などの予約語を使用することはできません。
+ ロール名は、デフォルトロールの予約済みプレフィックス `sys:` で始めることはできません。
+ RESTRICT パラメータを持ち、さらに別のロールに付与されているロールは削除できません。デフォルトの設定は RESTRICT です。削除しようとしたロールが別のロールを継承している場合、Amazon Redshift はエラーをスローします。
+ ロールに対する管理者としてのアクセス許可を持たないユーザーは、ロールを付与または取り消すことはできません。
+ RBAC は、システムテーブルおよびビューでは完全にはサポートされていません。システムテーブルおよびビューの RBAC アクセス許可は、アップグレード、ダウングレード、またはサイズ変更の際に保持されません。[Amazon Redshift でのシステム定義のロールデータ共有のためのシステム定義のロールとユーザー](r_roles-default.md) を使用して、システムテーブルおよびビューのアクセス許可を管理することをお勧めします。システムテーブルの詳細については、「[システムテーブルとビューのリファレンス](cm_chap_system-tables.md)」を参照してください。

# RBAC でのロールの管理
<a name="r_roles-managing"></a>

以下のコマンドを使用して、以下の操作を実行します。
+ ロールを作成するには、[CREATE ROLE](r_CREATE_ROLE.md) コマンドを使用します。
+ ロールの名前を変更したり、ロールの所有者を変更するには、[ALTER ROLE](r_ALTER_ROLE.md)コマンドを使用します。
+ ロールを削除するには、[DROP ROLE](r_DROP_ROLE.md) コマンドを使用します。
+ ユーザーにロールを付与するには、[GRANT](r_GRANT.md) コマンドを使用します。
+ ユーザーからロールを取り消すには、[REVOKE](r_REVOKE.md) コマンドを使用します。
+ ロールにシステムへのアクセス許可を付与するには、[GRANT](r_GRANT.md) コマンドを使用します。
+ ロールからシステムへのアクセス許可を取り消すには、[REVOKE](r_REVOKE.md) コマンドを使用します。

クラスターまたはワークグループ内のロールのリストを表示するには、「[SVV\$1ROLES](r_SVV_ROLES.md)」を参照してください。

# チュートリアル: RBAC でのロールの作成とクエリ
<a name="r_tutorial-RBAC"></a>

RBAC では、スーパーユーザーのアクセスが必要となるコマンドを実行するための、アクセス許可を持つロールを作成できます。これらの許可を含むロールで承認されているのであれば、ユーザーはこの種類のコマンドを実行できます。

このチュートリアルでは、作成するデータベースでアクセス許可を管理するのにロールベースのアクセスコントロール (RBAC) を使用できます。次に、データベースに接続し、2 つの異なるロールからデータベースにクエリを実行して RBAC の機能をテストします。

データベースをクエリするために作成して使用する 2 つのロールは `sales_ro` と `sales_rw` です。`sales_ro` ロールを作成し、`sales_ro` ロールを持つユーザーとしてデータをクエリします。`sales_ro` ユーザーは SELECT コマンドのみを使用でき、UPDATE コマンドは使用できません。そのため、`sales_rw` ロールを作成し、`sales_rw` ロールを持つユーザーとしてデータをクエリします。`sales_rw` ユーザーは SELECT コマンドと UPDATE コマンドは使用できます。

また、特定のコマンドへのアクセスを制限するロールを作成し、スーパーユーザーまたはユーザーのいずれかに対して、ロールを割り当てることもできます。

**タスク**
+ [前提条件](#tutorial-rbac-prereqs)
+ [ステップ 1: 管理者ユーザーを作成する](#tutorial-rbac-step1)
+ [ステップ 2: スキーマをセットアップする](#tutorial-rbac-step2)
+ [ステップ 3: 読み取り専用ユーザーを作成する](#tutorial-rbac-step3)
+ [ステップ 4: 読み取り専用ユーザーとしてデータをクエリする](#tutorial-rbac-step4)
+ [ステップ 5: 読み取り/書き込みユーザーを作成する](#tutorial-rbac-step5)
+ [ステップ 6: 継承された読み取り専用ロールのあるユーザーとしてデータをクエリする](#tutorial-rbac-step6)
+ [ステップ 7: 読み取り/書き込みロールに更新および挿入アクセス許可を付与する](#tutorial-rbac-step7)
+ [ステップ 8: 読み取り/書き込みユーザーとしてデータをクエリする](#tutorial-rbac-step8)
+ [ステップ 9: 管理者ユーザーとしてデータベース内のテーブルを分析してバキュームする](#tutorial-rbac-step9)
+ [ステップ 10: 読み取り/書き込みユーザーとしてテーブルを切り捨てる](#tutorial-rbac-step10)
+ [RBAC のシステム関数 (オプション)](#tutorial-rbac-system-functions)
+ [RBAC のシステムビュー (オプション)](#tutorial-rbac-system-views)
+ [RBAC で行レベルセキュリティを使用する (オプション)](#tutorial-rbac-rls)

## 前提条件
<a name="tutorial-rbac-prereqs"></a>
+ TICKIT サンプルデータベースがロードされた Amazon Redshift クラスターまたはサーバーレスワークグループを作成します。サーバーレスワークグループを作成するには、「[Redshift Serverless データウェアハウスの使用を開始](https://docs.aws.amazon.com/redshift/latest/gsg/new-user-serverless.html)」を参照してください。クラスターを作成するには、「[Amazon Redshift クラスターのサンプルを作成する](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-launch-sample-cluster.html)」を参照してください。TICKIT サンプルデータの詳細については、「[サンプルデータベース](c_sampledb.md)」を参照してください。
+ スーパーユーザーまたはロール管理者のアクセス許可を持つユーザーへのアクセスがあります。ロールの付与または取り消しを行えるのは、スーパーユーザーまたはロールの管理者のみです。RBAC に必要なアクセス許可の詳細については、「[RBAC でのシステムへのアクセス許可](r_roles-system-privileges.md)」を参照してください。
+ 「[RBAC でのロールの使用に関する考慮事項](r_role-usage-notes.md)」を確認します。

## ステップ 1: 管理者ユーザーを作成する
<a name="tutorial-rbac-step1"></a>

このチュートリアル用にセットアップするには、データベース管理者ロールを作成し、このステップでデータベース管理者ユーザーに割り当てます。データベース管理者はスーパーユーザーまたはロール管理者として作成する必要があります。

Amazon Redshift [クエリエディタ v2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html) のすべてのクエリを実行します。

1. 管理者ロール db\$1admin を作成するには、次の例を使用します。

   ```
   CREATE ROLE db_admin;
   ```

1. 次の例を使用して、dbadmin という名前のデータベースユーザーを作成します。

   ```
   CREATE USER dbadmin PASSWORD 'Test12345';
   ```

1. sys:dba という名前のシステム定義ロールを db\$1admin ロールに付与するには、次の例を使用します。sys:dba ロールが付与されると、dbadmin ユーザーはスキーマとテーブルを作成できます。詳細については、「[Amazon Redshift でのシステム定義のロールデータ共有のためのシステム定義のロールとユーザー](r_roles-default.md)」を参照してください。

## ステップ 2: スキーマをセットアップする
<a name="tutorial-rbac-step2"></a>

このステップでは、データベース管理者としてデータベースに接続します。次に、2 つのスキーマを作成し、それらにデータを追加します。

1. クエリエディタ v2 を使用して dbadmin ユーザーとして dev データベースに接続します。データベースへの接続の詳細については、「[クエリエディタ v2 の操作](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-using.html)」を参照してください。

1. セールスおよびマーケティングのデータベーススキーマを作成するには、次の例を使用します。

   ```
   CREATE SCHEMA sales;
   CREATE SCHEMA marketing;
   ```

1. セールススキーマのテーブルに値を作成して挿入するには、次の例を使用します。

   ```
   CREATE TABLE sales.cat(
   catid smallint,
   catgroup varchar(10),
   catname varchar(10),
   catdesc varchar(50)
   );
   INSERT INTO sales.cat(SELECT * FROM category);
   
   CREATE TABLE sales.dates(
   dateid smallint,
   caldate date,
   day char(3),
   week smallint,
   month char(5),
   qtr char(5),
   year smallint,
   holiday boolean
   );
   INSERT INTO sales.dates(SELECT * FROM date);
   
   CREATE TABLE sales.events(
   eventid integer,
   venueid smallint,
   catid smallint,
   dateid smallint,
   eventname varchar(200),
   starttime timestamp
   );
   INSERT INTO sales.events(SELECT * FROM event);
   
    CREATE TABLE sales.sale(
   salesid integer,
   listid integer,
   sellerid integer,
   buyerid integer,
   eventid integer,
   dateid smallint,
   qtysold smallint,
   pricepaid decimal(8,2),
   commission decimal(8,2),
   saletime timestamp
   );
   INSERT INTO sales.sale(SELECT * FROM sales);
   ```

1. マーケティングスキーマのテーブルに値を作成して挿入するには、次の例を使用します。

   ```
   CREATE TABLE marketing.cat(
   catid smallint,
   catgroup varchar(10),
   catname varchar(10),
   catdesc varchar(50)
   );
   INSERT INTO marketing.cat(SELECT * FROM category);
   
   CREATE TABLE marketing.dates(
   dateid smallint,
   caldate date,
   day char(3),
   week smallint,
   month char(5),
   qtr char(5),
   year smallint,
   holiday boolean
   );
   INSERT INTO marketing.dates(SELECT * FROM date);
   
   CREATE TABLE marketing.events(
   eventid integer,
   venueid smallint,
   catid smallint,
   dateid smallint,
   eventname varchar(200),
   starttime timestamp
   );
   INSERT INTO marketing.events(SELECT * FROM event);
   
   CREATE TABLE marketing.sale(
   marketingid integer,
   listid integer,
   sellerid integer,
   buyerid integer,
   eventid integer,
   dateid smallint,
   qtysold smallint,
   pricepaid decimal(8,2),
   commission decimal(8,2),
   saletime timestamp
   );
   INSERT INTO marketing.sale(SELECT * FROM marketing);
   ```

## ステップ 3: 読み取り専用ユーザーを作成する
<a name="tutorial-rbac-step3"></a>

このステップでは、読み取り専用ロールとその読み取り専用ロールのセールスアナリストユーザーを作成します。セールスアナリストがコミッションが最も高かったイベントを検索するという割り当てられたタスクを実行するには、セールススキーマのテーブルへの読み取り専用アクセスのみが必要です。

1. dbadmin ユーザーとしてデータベースに接続します。

1. sales\$1ro ロールを作成するには、次の例を使用します。

   ```
   CREATE ROLE sales_ro;
   ```

1. セールスアナリストユーザーを作成するには、次の例を使用します。

   ```
   CREATE USER salesanalyst PASSWORD 'Test12345';
   ```

1. sales\$1ro ロールに、セールススキーマのオブジェクトの使用と選択のアクセス許可を付与するには、次の例を使用します。

   ```
   GRANT USAGE ON SCHEMA sales TO ROLE sales_ro;
   GRANT SELECT ON ALL TABLES IN SCHEMA sales TO ROLE sales_ro;
   ```

1. セールスアナリストユーザーに sales\$1ro ロールを付与するには、次の例を使用します。

   ```
   GRANT ROLE sales_ro TO salesanalyst;
   ```

## ステップ 4: 読み取り専用ユーザーとしてデータをクエリする
<a name="tutorial-rbac-step4"></a>

このステップでは、セールスアナリストユーザーがセールススキーマからデータをクエリします。次に、セールスアナリストユーザーはテーブルの更新とマーケティングスキーマのテーブルの読み取りを試みます。

1. セールスアナリストユーザーとしてデータベースに接続します。

1. 最もコミッションが高い 10 件のセールスを検索するには、次の例を使用します。

   ```
   SET SEARCH_PATH TO sales;
   SELECT DISTINCT events.dateid, sale.commission, cat.catname
   FROM sale, events, dates, cat   
   WHERE events.dateid=dates.dateid AND events.dateid=sale.dateid AND events.catid = cat.catid
   ORDER BY 2 DESC LIMIT 10;
                  
   +--------+------------+----------+
   | dateid | commission | catname  |
   +--------+------------+----------+
   |   1880 |     1893.6 | Pop      |
   |   1880 |     1893.6 | Opera    |
   |   1880 |     1893.6 | Plays    |
   |   1880 |     1893.6 | Musicals |
   |   1861 |       1500 | Plays    |
   |   2003 |       1500 | Pop      |
   |   1861 |       1500 | Opera    |
   |   2003 |       1500 | Plays    |
   |   1861 |       1500 | Musicals |
   |   1861 |       1500 | Pop      |
   +--------+------------+----------+
   ```

1. セールススキーマでイベントテーブルから 10 件のイベントを選択するには、次の例を使用します。

   ```
   SELECT * FROM sales.events LIMIT 10;
                  
   +---------+---------+-------+--------+--------------------+---------------------+
   | eventid | venueid | catid | dateid |     eventname      |      starttime      |
   +---------+---------+-------+--------+--------------------+---------------------+
   |    4836 |      73 |     9 |   1871 | Soulfest           | 2008-02-14 19:30:00 |
   |    5739 |      41 |     9 |   1871 | Fab Faux           | 2008-02-14 19:30:00 |
   |     627 |     229 |     6 |   1872 | High Society       | 2008-02-15 14:00:00 |
   |    2563 |     246 |     7 |   1872 | Hamlet             | 2008-02-15 20:00:00 |
   |    7703 |      78 |     9 |   1872 | Feist              | 2008-02-15 14:00:00 |
   |    7903 |      90 |     9 |   1872 | Little Big Town    | 2008-02-15 19:30:00 |
   |    7925 |     101 |     9 |   1872 | Spoon              | 2008-02-15 19:00:00 |
   |    8113 |      17 |     9 |   1872 | Santana            | 2008-02-15 15:00:00 |
   |     463 |     303 |     8 |   1873 | Tristan und Isolde | 2008-02-16 19:00:00 |
   |     613 |     236 |     6 |   1873 | Pal Joey           | 2008-02-16 15:00:00 |
   +---------+---------+-------+--------+--------------------+---------------------+
   ```

1. eventid 1 のイベント名を更新するには、次の例を実行します。この例では、セールスアナリストユーザーはセールススキーマのイベントテーブルに対する SELECT アクセス許可しか持っていないため、「アクセス許可が拒否されました」というエラーが発生します。イベントテーブルを更新するには、sales\$1ro ロールに UPDATE 権限を付与する必要があります。テーブルを更新するアクセス許可の付与の詳細については、「[GRANT](r_GRANT.md) の UPDATE パラメータ」を参照してください。UPDATE コマンドの詳細については、「[UPDATE](r_UPDATE.md)」を参照してください。

   ```
   UPDATE sales.events
   SET eventname = 'Comment event'
   WHERE eventid = 1;
                     
   ERROR: permission denied for relation events
   ```

1. マーケティングスキーマでイベントテーブルからすべてを選択するには、次の例を使用します。この例では、セールスアナリストユーザーはセールススキーマのイベントテーブルに対する SELECT アクセス許可しか持っていないため、「アクセス許可が拒否されました」というエラーが発生します。マーケティングスキーマのイベントテーブルからデータを選択するには、マーケティングスキーマのイベントテーブルに対する SELECT アクセス許可を sales\$1ro ロールに付与する必要があります。

   ```
   SELECT * FROM marketing.events;
                  
                  ERROR: permission denied for schema marketing
   ```

## ステップ 5: 読み取り/書き込みユーザーを作成する
<a name="tutorial-rbac-step5"></a>

このステップでは、セールススキーマのデータ処理のための抽出、変換、ロード (ETL) パイプラインの構築を担当するセールスエンジニアに読み取り専用アクセスが与えられますが、タスクを実行するための読み取り/書き込みアクセスが後に付与されます。

1. dbadmin ユーザーとしてデータベースに接続します。

1. セールススキーマで sales\$1rw ロールを作成するには、次の例を使用します。

   ```
   CREATE ROLE sales_rw;
   ```

1. セールスエンジニアユーザーを作成するには、次の例を使用します。

   ```
   CREATE USER salesengineer PASSWORD 'Test12345';
   ```

1. sales\$1ro ロールを割り当てることで、sales\$1rw ロールにセールススキーマのオブジェクトの使用と選択のアクセス許可を付与するには、次の例を使用します。Amazon Redshift でロールがアクセス許可を継承する方法の詳細については、「[ロール階層](t_role_hierarchy.md)」を参照してください。

   ```
   GRANT ROLE sales_ro TO ROLE sales_rw;
   ```

1. セールスエンジニアユーザーに sales\$1rw ロールを付与するには、次の例を使用します。

   ```
   GRANT ROLE sales_rw TO salesengineer;
   ```

## ステップ 6: 継承された読み取り専用ロールのあるユーザーとしてデータをクエリする
<a name="tutorial-rbac-step6"></a>

このステップでは、セールスエンジニアユーザーが読み取りアクセス許可が付与される前にイベントテーブルを更新しようとします。

1. セールスエンジニアユーザーとしてデータベースに接続します。

1. セールスエンジニアユーザーは、セールススキーマのイベントテーブルからデータを正常に読み取ることができます。セールススキーマでイベントテーブルから eventid 1 のイベントを選択するには、次の例を使用します。

   ```
   SELECT * FROM sales.events where eventid=1;
                     
   +---------+---------+-------+--------+-----------------+---------------------+
   | eventid | venueid | catid | dateid |    eventname    |      starttime      |
   +---------+---------+-------+--------+-----------------+---------------------+
   |       1 |     305 |     8 |   1851 | Gotterdammerung | 2008-01-25 14:30:00 |
   +---------+---------+-------+--------+-----------------+---------------------+
   ```

1. マーケティングスキーマでイベントテーブルからすべてを選択するには、次の例を使用します。セールスエンジニアユーザーにはマーケティングスキーマのテーブルに対するアクセス許可がないため、このクエリは結果としてアクセス許可拒否エラーになります。マーケティングスキーマのイベントテーブルからデータを選択するには、マーケティングスキーマのイベントテーブルに対する SELECT アクセス許可を sales\$1rw ロールに付与する必要があります。

   ```
   SELECT * FROM marketing.events;
   
   ERROR: permission denied for schema marketing
   ```

1. eventid 1 のイベント名を更新するには、次の例を実行します。この例では、セールスエンジニアユーザーにはセールススキーマのイベントテーブルに対する選択アクセス許可しかないため、アクセス許可拒否エラーが発生します。イベントテーブルを更新するには、sales\$1rw ロールに UPDATE のアクセス許可を付与する必要があります。

   ```
   UPDATE sales.events
   SET eventname = 'Comment event'
   WHERE eventid = 1;
   
   ERROR: permission denied for relation events
   ```

## ステップ 7: 読み取り/書き込みロールに更新および挿入アクセス許可を付与する
<a name="tutorial-rbac-step7"></a>

sales\$1rw ロールに対するアクセス許可を更新して挿入します。

1. dbadmin ユーザーとしてデータベースに接続します。

1. sales\$1rw ロールに UPDATE、INSERT、DELETE アクセス許可を付与するには、次の例を使用します。

   ```
   GRANT UPDATE, INSERT, ON ALL TABLES IN SCHEMA sales TO role sales_rw;
   ```

## ステップ 8: 読み取り/書き込みユーザーとしてデータをクエリする
<a name="tutorial-rbac-step8"></a>

このステップでは、各自のロールに挿入アクセス許可と更新アクセス許可が付与された後に、セールスエンジニアがテーブルを正常に更新します。次に、セールスエンジニアはイベントテーブルの分析とバキュームを試みますが、失敗します。

1. セールスエンジニアユーザーとしてデータベースに接続します。

1. eventid 1 のイベント名を更新するには、次の例を実行します。

   ```
   UPDATE sales.events
   SET eventname = 'Comment event'
   WHERE eventid = 1;
   ```

1. 前のクエリで行った変更を表示するには、次の例を使用してセールススキーマでイベントテーブルから eventid 1 のイベントを選択します。

   ```
   SELECT * FROM sales.events WHERE eventid=1;
   
   +---------+---------+-------+--------+---------------+---------------------+
   | eventid | venueid | catid | dateid |   eventname   |      starttime      |
   +---------+---------+-------+--------+---------------+---------------------+
   |       1 |     305 |     8 |   1851 | Comment event | 2008-01-25 14:30:00 |
   +---------+---------+-------+--------+---------------+---------------------+
   ```

1. セールススキーマで更新されたイベントテーブルを分析するには、次の例を使用します。この例では、セールスエンジニアユーザーに必要なアクセス許可がなく、セールススキーマのイベントテーブルの所有者でもないため、アクセス許可拒否エラーが発生します。イベントテーブルを分析するには、GRANT コマンドを使用して ANALYZE のアクセス許可を sales\$1rw ロールに付与する必要があります。ANALYZE コマンドの詳細については、「[ANALYZE](r_ANALYZE.md)」を参照してください。

   ```
   ANALYZE sales.events;
                  
                  ERROR: skipping "events" --- only table or database owner can analyze
   ```

1. 更新されたイベントテーブルをバキュームするには、次の例を使用します。この例では、セールスエンジニアユーザーに必要なアクセス許可がなく、セールススキーマのイベントテーブルの所有者でもないため、アクセス許可拒否エラーが発生します。イベントテーブルをバキュームするには、GRANT コマンドを使用して VACUUM のアクセス許可を sales\$1rw ロールに付与する必要があります。VACUUM コマンドの詳細については、「[VACUUM](r_VACUUM_command.md)」を参照してください。

   ```
   VACUUM sales.events;
                     
   ERROR: skipping "events" --- only table or database owner can vacuum it
   ```

## ステップ 9: 管理者ユーザーとしてデータベース内のテーブルを分析してバキュームする
<a name="tutorial-rbac-step9"></a>

このステップでは、dbadmin ユーザーがすべてのテーブルを分析してバキュームします。ユーザーにはこのデータベースに対する管理者アクセス許可があるため、これらのコマンドを実行できます。

1. dbadmin ユーザーとしてデータベースに接続します。

1. セールススキーマでイベントテーブルを分析するには、次の例を使用します。

   ```
   ANALYZE sales.events;
   ```

1. セールススキーマでイベントテーブルをバキュームするには、次の例を使用します。

   ```
   VACUUM sales.events;
   ```

1. マーケティングスキーマでイベントテーブルを分析するには、次の例を使用します。

   ```
   ANALYZE marketing.events;
   ```

1. マーケティングスキーマでイベントテーブルをバキュームするには、次の例を使用します。

   ```
   VACUUM marketing.events;
   ```

## ステップ 10: 読み取り/書き込みユーザーとしてテーブルを切り捨てる
<a name="tutorial-rbac-step10"></a>

このステップでは、セールスエンジニアユーザーがセールススキーマのイベントテーブルを切り捨てようとしますが、dbadmin ユーザーから切り捨てアクセス許可が付与された場合にのみ成功します。

1. セールスエンジニアユーザーとしてデータベースに接続します。

1. セールススキーマのイベントテーブルからすべての行を削除するには、次の例を使用します。この例では、セールスエンジニアユーザーに必要なアクセス許可がなく、セールススキーマのイベントテーブルの所有者でもないため、エラーが発生します。イベントテーブルを切り捨てるには、GRANT コマンドを使用して TRUNCATE のアクセス許可を sales\$1rw ロールに付与する必要があります。TRUNCATE コマンドの詳細については、「[TRUNCATE](r_TRUNCATE.md)」を参照してください。

   ```
   TRUNCATE sales.events;
                  
   ERROR: must be owner of relation events
   ```

1. dbadmin ユーザーとしてデータベースに接続します。

1. テーブル切り捨て特権を sales\$1rw ロールを付与するには、次の例を使用します。

   ```
   GRANT TRUNCATE TABLE TO role sales_rw;
   ```

1. クエリエディタ v2 を使用してセールスエンジニアユーザーとしてデータベースに接続します。

1. セールススキーマでイベントテーブルから 10 件のイベントを読み取るには、次の例を使用します。

   ```
   SELECT * FROM sales.events ORDER BY eventid LIMIT 10;
                  
   +---------+---------+-------+--------+-----------------------------+---------------------+
   | eventid | venueid | catid | dateid |          eventname          |      starttime      |
   +---------+---------+-------+--------+-----------------------------+---------------------+
   |       1 |     305 |     8 |   1851 | Comment event               | 2008-01-25 14:30:00 |
   |       2 |     306 |     8 |   2114 | Boris Godunov               | 2008-10-15 20:00:00 |
   |       3 |     302 |     8 |   1935 | Salome                      | 2008-04-19 14:30:00 |
   |       4 |     309 |     8 |   2090 | La Cenerentola (Cinderella) | 2008-09-21 14:30:00 |
   |       5 |     302 |     8 |   1982 | Il Trovatore                | 2008-06-05 19:00:00 |
   |       6 |     308 |     8 |   2109 | L Elisir d Amore            | 2008-10-10 19:30:00 |
   |       7 |     309 |     8 |   1891 | Doctor Atomic               | 2008-03-06 14:00:00 |
   |       8 |     302 |     8 |   1832 | The Magic Flute             | 2008-01-06 20:00:00 |
   |       9 |     308 |     8 |   2087 | The Fly                     | 2008-09-18 19:30:00 |
   |      10 |     305 |     8 |   2079 | Rigoletto                   | 2008-09-10 15:00:00 |
   +---------+---------+-------+--------+-----------------------------+---------------------+
   ```

1. セールススキーマでイベントテーブルを切り捨てるには、次の例を使用します。

   ```
   TRUNCATE sales.events;
   ```

1. セールススキーマで更新されたイベントテーブルからデータを読み取るには、次の例を使用します。

   ```
   SELECT * FROM sales.events ORDER BY eventid LIMIT 10;
                  
   +---------+---------+-------+--------+-----------------------------+---------------------+
   | eventid | venueid | catid | dateid |          eventname          |      starttime      |
   +---------+---------+-------+--------+-----------------------------+---------------------+
   ```

### マーケティングスキーマに対して読み取り専用ロールおよび読み取り/書き込みロールを作成する (オプション)
<a name="tutorial-rbac-create-marketing-schema"></a>

このステップでは、マーケティングスキーマに対して読み取り専用ロールおよび読み取り/書き込みロールを作成します。

1. dbadmin ユーザーとしてデータベースに接続します。

1. マーケティングスキーマの読み取り専用ロールと読み取り/書き込みロールを作成するには、次の例を使用します。

   ```
   CREATE ROLE marketing_ro;
   
   CREATE ROLE marketing_rw;
   
   GRANT USAGE ON SCHEMA marketing TO ROLE marketing_ro, ROLE marketing_rw;
   
   GRANT SELECT ON ALL TABLES IN SCHEMA marketing TO ROLE marketing_ro;
   
   GRANT ROLE marketing_ro TO ROLE marketing_rw;
   
   GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA marketing TO ROLE marketing_rw;
   
   CREATE USER marketinganalyst PASSWORD 'Test12345';
   
   CREATE USER marketingengineer PASSWORD 'Test12345';
   
   GRANT ROLE marketing_ro TO marketinganalyst;
   
   GRANT ROLE marketing_rw TO marketingengineer;
   ```

## RBAC のシステム関数 (オプション)
<a name="tutorial-rbac-system-functions"></a>

Amazon Redshift には、追加のグループまたは role\$1is\$1member\$1of ロールおよび user\$1is\$1member\$1of ロールのユーザーメンバーシップおよびロールメンバーシップに関する情報を提供します。これらの関数は、スーパーユーザーと一般ユーザーが利用できます。スーパーユーザーはすべてのロールメンバーシップを確認できます。一般ユーザーは、アクセスが付与されているロールのメンバーシップのみを確認できます。

role\$1is\$1member\$1of 関数を使用するには

1. セールスエンジニアユーザーとしてデータベースに接続します。

1. sales\$1rw ロールが sales\$1ro ロールのメンバーかどうかを確認するには、次の例を使用します。

   ```
   SELECT role_is_member_of('sales_rw', 'sales_ro');
                  
   +-------------------+
   | role_is_member_of |
   +-------------------+
   | true              |
   +-------------------+
   ```

1. sales\$1ro ロールが sales\$1rw ロールのメンバーかどうかを確認するには、次の例を使用します。

   ```
   SELECT role_is_member_of('sales_ro', 'sales_rw');
                  
   +-------------------+
   | role_is_member_of |
   +-------------------+
   | false             |
   +-------------------+
   ```

user\$1is\$1member\$1of 関数を使用するには

1. セールスエンジニアユーザーとしてデータベースに接続します。

1. 次の例では、セールスアナリストユーザーのユーザーメンバーシップを確認しようとしています。セールスエンジニアはセールスアナリストへのアクセスがないため、このクエリはエラーになります。このコマンドを正常に実行するには、セールスアナリストユーザーとしてデータベースに接続し、例を使用します。

   ```
   SELECT user_is_member_of('salesanalyst', 'sales_ro');
                  
   ERROR
   ```

1. スーパーユーザーとしてデータベースに接続します。

1. スーパーユーザーとして接続しているときにセールスアナリストユーザーのメンバーシップを確認するには、次の例を使用します。

   ```
   SELECT user_is_member_of('salesanalyst', 'sales_ro');
                  
   +-------------------+
   | user_is_member_of |
   +-------------------+
   | true              |
   +-------------------+
   ```

1. dbadmin ユーザーとしてデータベースに接続します。

1. セールスエンジニアのメンバーシップを確認するには、次の例を使用します。

   ```
   SELECT user_is_member_of('salesengineer', 'sales_ro');
                  
   +-------------------+
   | user_is_member_of |
   +-------------------+
   | true              |
   +-------------------+
                  
   SELECT user_is_member_of('salesengineer', 'marketing_ro');
   
   +-------------------+
   | user_is_member_of |
   +-------------------+
   | false             |
   +-------------------+
                  
   SELECT user_is_member_of('marketinganalyst', 'sales_ro');
                  
   +-------------------+
   | user_is_member_of |
   +-------------------+
   | false             |
   +-------------------+
   ```

## RBAC のシステムビュー (オプション)
<a name="tutorial-rbac-system-views"></a>

ロール、ユーザーへのロールの割り当て、ロール階層、およびロールによるデータベースオブジェクトの特権を表示するには、Amazon Redshift のシステムビューを使用します。これらのビューは、スーパーユーザーと一般ユーザーが利用できます。スーパーユーザーはすべてのロールの詳細を確認できます。一般ユーザーは、アクセスが付与されているロールの詳細のみを確認できます。

1. クラスターで明示的にロールが付与されたユーザーの一覧を表示するには、次の例を使用します。

   ```
   SELECT * FROM svv_user_grants;
   ```

1. クラスターで明示的にロールが付与されたロールの一覧を表示するには、次の例を使用します。

   ```
   SELECT * FROM svv_role_grants;
   ```

システムビューの全リストについては、「[SVV メタデータビュー](svv_views.md)」を参照してください。

## RBAC で行レベルセキュリティを使用する (オプション)
<a name="tutorial-rbac-rls"></a>

機密データに対するきめ細かなアクセス制御を行うには、行レベルセキュリティ (RLS) を使用します。RLS の詳細については、「[行レベルのセキュリティ](t_rls.md)」を参照してください。

このセクションでは、、メジャーリーグベースボールの `catdesc` 値を持つ `cat` テーブル内の行のみを表示する `salesengineer` アクセス許可をユーザーに付与する RLS ポリシーを作成します。次に、`salesengineer` ユーザーとしてデータベースにクエリを実行します。

1. `salesengineer` ユーザーとしてデータベースに接続します。

1. `cat` テーブルの最初の 5 エントリを表示するには、次の例を使用します。

   ```
   SELECT * 
   FROM sales.cat
   ORDER BY catid ASC
   LIMIT 5;
                     
   +-------+----------+---------+---------------------------------+
   | catid | catgroup | catname |             catdesc             |
   +-------+----------+---------+---------------------------------+
   |     1 | Sports   | MLB     | Major League Baseball           |
   |     2 | Sports   | NHL     | National Hockey League          |
   |     3 | Sports   | NFL     | National Football League        |
   |     4 | Sports   | NBA     | National Basketball Association |
   |     5 | Sports   | MLS     | Major League Soccer             |
   +-------+----------+---------+---------------------------------+
   ```

1. `dbadmin` ユーザーとしてデータベースに接続します。

1. `cat` テーブル内の `catdesc` 列の RLS ポリシーを作成するには、次の例を使用します。

   ```
   CREATE RLS POLICY policy_mlb_engineer
   WITH (catdesc VARCHAR(50)) 
   USING (catdesc = 'Major League Baseball');
   ```

1. RLS ポリシーを `sales_rw` ロールにアタッチするには、次の例を使用します。

   ```
   ATTACH RLS POLICY policy_mlb_engineer ON sales.cat TO ROLE sales_rw; 
   ```

1. RLS を有効にするようにテーブルを変更するには、次の例を使用します。

   ```
   ALTER TABLE sales.cat ROW LEVEL SECURITY ON; 
   ```

1. `salesengineer` ユーザーとしてデータベースに接続します。

1. `cat` テーブルの最初の 5 エントリを表示するには、次の例を使用します。`catdesc` 列が `Major League Baseball` のときのみエントリが表示されることに注意してください。

   ```
   SELECT * 
   FROM sales.cat
   ORDER BY catid ASC
   LIMIT 5;
                  
   +-------+----------+---------+-----------------------+
   | catid | catgroup | catname |        catdesc        |
   +-------+----------+---------+-----------------------+
   |     1 | Sports   | MLB     | Major League Baseball |
   +-------+----------+---------+-----------------------+
   ```

1. `salesanalyst` ユーザーとしてデータベースに接続します。

1. `cat` テーブルの最初の 5 エントリを表示するには、次の例を使用します。デフォルトのすべて拒否ポリシーが適用されているため、エントリは表示されないことに注意してください。

   ```
   SELECT * 
   FROM sales.cat
   ORDER BY catid ASC
   LIMIT 5;
                  
   +-------+----------+---------+-----------------------+
   | catid | catgroup | catname |        catdesc        |
   +-------+----------+---------+-----------------------+
   ```

1. `dbadmin` ユーザーとしてデータベースに接続します。

1. IGNORE RLS アクセス許可を `sales_ro` ロールに付与するには、次の例を使用します。これにより、`salesanalyst` ユーザーは `sales_ro` ロールのメンバーであるため、RLS ポリシーを無視するアクセス許可が付与されます。

   ```
   GRANT IGNORE RLS TO ROLE sales_ro; 
   ```

1. `salesanalyst` ユーザーとしてデータベースに接続します。

1. `cat` テーブルの最初の 5 エントリを表示するには、次の例を使用します。

   ```
   SELECT * 
   FROM sales.cat
   ORDER BY catid ASC
   LIMIT 5;
                  
   +-------+----------+---------+---------------------------------+
   | catid | catgroup | catname |             catdesc             |
   +-------+----------+---------+---------------------------------+
   |     1 | Sports   | MLB     | Major League Baseball           |
   |     2 | Sports   | NHL     | National Hockey League          |
   |     3 | Sports   | NFL     | National Football League        |
   |     4 | Sports   | NBA     | National Basketball Association |
   |     5 | Sports   | MLS     | Major League Soccer             |
   +-------+----------+---------+---------------------------------+
   ```

1. `dbadmin` ユーザーとしてデータベースに接続します。

1. `sales_ro` ロールから IGNORE RLS アクセス許可を取り消すには、次の例を使用してください。

   ```
   REVOKE IGNORE RLS FROM ROLE sales_ro;
   ```

1. `salesanalyst` ユーザーとしてデータベースに接続します。

1. `cat` テーブルの最初の 5 エントリを表示するには、次の例を使用します。デフォルトのすべて拒否ポリシーが適用されているため、エントリは表示されないことに注意してください。

   ```
   SELECT * 
   FROM sales.cat
   ORDER BY catid ASC
   LIMIT 5;
                  
   +-------+----------+---------+-----------------------+
   | catid | catgroup | catname |        catdesc        |
   +-------+----------+---------+-----------------------+
   ```

1. `dbadmin` ユーザーとしてデータベースに接続します。

1. RLS ポリシーを `cat` テーブルから切り離すには、次の例を使用します。

   ```
   DETACH RLS POLICY policy_mlb_engineer ON cat FROM ROLE sales_rw;
   ```

1. `salesanalyst` ユーザーとしてデータベースに接続します。

1. `cat` テーブルの最初の 5 エントリを表示するには、次の例を使用します。デフォルトのすべて拒否ポリシーが適用されているため、エントリは表示されないことに注意してください。

   ```
   SELECT * 
   FROM sales.cat
   ORDER BY catid ASC
   LIMIT 5;
                  
   +-------+----------+---------+---------------------------------+
   | catid | catgroup | catname |             catdesc             |
   +-------+----------+---------+---------------------------------+
   |     1 | Sports   | MLB     | Major League Baseball           |
   |     2 | Sports   | NHL     | National Hockey League          |
   |     3 | Sports   | NFL     | National Football League        |
   |     4 | Sports   | NBA     | National Basketball Association |
   |     5 | Sports   | MLS     | Major League Soccer             |
   +-------+----------+---------+---------------------------------+
   ```

1. `dbadmin` ユーザーとしてデータベースに接続します。

1. RLS ポリシーをドロップするには、次の例を使用します。

   ```
   DROP RLS POLICY policy_mlb_engineer;
   ```

1. RLS を削除するには、次の例を使用します。

   ```
   ALTER TABLE cat ROW LEVEL SECURITY OFF;
   ```

## 関連トピック
<a name="tutorial-rbac-related-topics"></a>

RBAC の詳細については、次のドキュメントを参照してください。
+ [ロール階層](t_role_hierarchy.md)
+ [ロールの割り当て](t_role_assignment.md)
+ [データベースオブジェクトへのアクセス許可](r_roles-database-privileges.md)
+ [RBAC での ALTER DEFAULT PRIVILEGES](r_roles-alter-default-privileges.md)