

 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="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\_admin を作成するには、次の例を使用します。

   ```
   CREATE ROLE db_admin;
   ```

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

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

1. sys:dba という名前のシステム定義ロールを db\_admin ロールに付与するには、次の例を使用します。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\_ro ロールを作成するには、次の例を使用します。

   ```
   CREATE ROLE sales_ro;
   ```

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

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

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

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

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

   ```
   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\_ro ロールに 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\_ro ロールに付与する必要があります。

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

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

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

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

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

   ```
   CREATE ROLE sales_rw;
   ```

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

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

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

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

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

   ```
   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\_rw ロールに付与する必要があります。

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

1. eventid 1 のイベント名を更新するには、次の例を実行します。この例では、セールスエンジニアユーザーにはセールススキーマのイベントテーブルに対する選択アクセス許可しかないため、アクセス許可拒否エラーが発生します。イベントテーブルを更新するには、sales\_rw ロールに 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\_rw ロールに対するアクセス許可を更新して挿入します。

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

1. sales\_rw ロールに 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\_rw ロールに付与する必要があります。ANALYZE コマンドの詳細については、「[ANALYZE](r_ANALYZE.md)」を参照してください。

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

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

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

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

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

   ```
   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\_is\_member\_of ロールおよび user\_is\_member\_of ロールのユーザーメンバーシップおよびロールメンバーシップに関する情報を提供します。これらの関数は、スーパーユーザーと一般ユーザーが利用できます。スーパーユーザーはすべてのロールメンバーシップを確認できます。一般ユーザーは、アクセスが付与されているロールのメンバーシップのみを確認できます。

role\_is\_member\_of 関数を使用するには

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

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

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

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

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

user\_is\_member\_of 関数を使用するには

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)