

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 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 的許可。角色階層會讓 r2 從 r1 繼承許可。Amazon Redshift 會透過每個角色授權來傳播許可。將 r1 授予 r2，然後再將 r2 授予 r3，即可將這三個角色的所有許可授權給 r3。因此，透過將 r3 授予使用者，使用者就會擁有這三個角色的所有許可。

Amazon Redshift 不允許建立角色授權循環。當巢狀角色被指派回角色階層中較早的角色 (例如 r3 被指派回 r1) 時，就會發生角色授權循環。如需建立角色及管理角色指派的相關資訊，請參閱 [管理 RBAC 中的角色](r_roles-managing.md)。

# 角色指派
<a name="t_role_assignment"></a>

超級使用者和擁有 CREATE ROLE 許可的一般使用者可以使用 CREATE ROLE 陳述式來建立角色。超級使用者和角色管理員可以使用 GRANT ROLE 陳述式將角色授予其他人。他們可以使用 REVOKE ROLE 陳述式來撤銷其他人的角色，以及使用 DROP ROLE 陳述式來捨棄角色。角色管理員包括角色擁有者和獲派角色具有 ADMIN OPTION 許可的使用者。

只有超級使用者或角色管理員可以授予和撤銷角色。您可以對一個或多個角色或使用者授予或撤銷一個或多個角色。在 GRANT ROLE 陳述式中使用 WITH ADMIN OPTION 選項會為所有承授者提供所有授予角色的管理選項。

Amazon Redshift 支援不同的角色指派組合，例如授予多個角色或擁有多個承授者。WITH ADMIN OPTION 僅適用於使用者，而不適用於角色。同樣地，使用 REVOKE ROLE 陳述式中的 WITH ADMIN OPTION 選項，可移除承授者的角色和管理授權。與 ADMIN OPTION 搭配使用時，只能撤銷角色的管理授權。

下列範例會從 `user2` 中撤銷 `sample_role2` 角色的管理授權。

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

如需建立角色及管理角色指派的相關資訊，請參閱 [管理 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/zh_tw/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/zh_tw/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/zh_tw/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) 來管理您在資料庫中建立的許可。然後您會連線到資料庫，並透過兩個不同的角色查詢資料庫，以測試 RBAC 的功能。

您建立並用來查詢資料庫的兩個角色為 `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>

在此步驟中，您會以資料庫管理員的身分連線至資料庫。然後您會建立兩個結構描述，並在其中新增資料。

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>

在此步驟中，您會建立唯讀角色並為該唯讀角色建立 salesanalyst 使用者。銷售分析師只需要以唯讀方式存取銷售結構描述中的資料表，即可完成尋找產生最高佣金事件的指派任務。

1. 以 dbadmin 使用者身分連線至資料庫。

1. 若要建立 sales\$1ro 角色，請使用下列範例。

   ```
   CREATE ROLE sales_ro;
   ```

1. 若要建立 salesanalyst 使用者，請使用下列範例。

   ```
   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. 若要對 salesanalyst 使用者授予 sales\$1ro 角色，請使用下列範例。

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

## 步驟 4：以唯讀使用者身分查詢資料
<a name="tutorial-rbac-step4"></a>

在此步驟中，salesanalyst 使用者會查詢銷售結構描述中的資料。然後 salesanalyst 使用者會嘗試更新行銷結構描述中的資料表和讀取資料表。

1. 以 salesanalyst 使用者身分連線至資料庫。

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 的 eventname，請執行下列範例。此範例將導致許可遭拒錯誤，因為 salesanalyst 使用者對銷售結構描述中的事件資料表只擁有 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. 若要嘗試從行銷結構描述的事件資料表中選取所有內容，請使用下列範例。此範例將導致許可遭拒錯誤，因為 salesanalyst 使用者對銷售結構描述中的事件資料表只具有 SELECT 許可。若要從行銷結構描述的事件資料表中選取資料，您必須對 sales\$1ro 角色授予行銷結構描述中事件資料表的 SELECT 許可。

   ```
   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. 若要建立 salesengineer 使用者，請使用下列範例。

   ```
   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. 若要對 salesengineer 使用者授予 sales\$1rw 角色，請使用下列範例。

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

## 步驟 6：以具有繼承唯讀角色的使用者身分查詢資料
<a name="tutorial-rbac-step6"></a>

在此步驟中，salesengineer 使用者會在獲得讀取許可之前，嘗試更新事件資料表。

1. 以 salesengineer 使用者身分連線至資料庫。

1. salesengineer 使用者可以從銷售結構描述的事件資料表成功讀取資料。若要從銷售結構描述中的事件資料表選取 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. 若要嘗試從行銷結構描述的事件資料表中選取所有內容，請使用下列範例。salesengineer 使用者未具備行銷結構描述中資料表的許可，因此這個查詢會導致許可遭拒錯誤。若要從行銷結構描述的事件資料表中選取資料，您必須對 sales\$1rw 角色授予行銷結構描述中事件資料表的 SELECT 許可。

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

1. 若要嘗試更新 eventid 1 的 eventname，請執行下列範例。此範例將導致許可遭拒錯誤，因為 salesengineer 使用者對銷售結構描述中的事件資料表只擁有選取許可。若要更新事件資料表，您必須對 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>

在此步驟中，salesengineer 會在其角色獲得插入和更新許可後，成功更新資料表。接下來，salesengineer 會嘗試分析和清空事件資料表，但是會失敗。

1. 以 salesengineer 使用者身分連線至資料庫。

1. 若要更新 eventid 1 的 eventname，請執行下列範例。

   ```
   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. 若要分析銷售結構描述中更新的事件資料表，請使用下列範例。此範例將導致許可遭拒錯誤，因為 salesengineer 使用者未具備必要的許可，也不是銷售結構描述中事件資料表的擁有者。若要分析事件資料表，您必須使用 GRANT 命令，對 sales\$1rw 角色授予 ANALYZE 許可。如需 ANALYZE 命令的詳細資訊，請參閱 [ANALYZE](r_ANALYZE.md)。

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

1. 若要清空更新的事件資料表，請使用下列範例。此範例將導致許可遭拒錯誤，因為 salesengineer 使用者未具備必要的許可，也不是銷售結構描述中事件資料表的擁有者。若要清空事件資料表，您必須使用 GRANT 命令，對 sales\$1rw 角色授予 VACUUM 許可。如需 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>

在此步驟中，salesengineer 使用者會嘗試截斷銷售結構描述中的事件資料表，但只有在 dbadmin 使用者對其授予截斷許可時才會成功。

1. 以 salesengineer 使用者身分連線至資料庫。

1. 若要嘗試從銷售結構描述的事件資料表中刪除所有列，請使用下列範例。此範例將導致錯誤，因為 salesengineer 使用者未具備必要的許可，也不是銷售結構描述中事件資料表的擁有者。若要截斷事件資料表，您必須使用 GRANT 命令，對 sales\$1rw 角色授予 TRUNCATE 許可。如需 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 以 salesengineer 使用者身分連線至資料庫。

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. 以 salesengineer 使用者身分連線至資料庫。

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. 以 salesengineer 使用者身分連線至資料庫。

1. 下列範例會嘗試查看 salesanalyst 使用者的使用者成員資格。此查詢會導致錯誤，因為 salesengineer 無法存取 salesanalyst。若要成功執行此命令，請以 salesanalyst 使用者身分連線至資料庫，然後使用此範例。

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

1. 以超級使用者身分連線至資料庫。

1. 若要在以超級使用者身分連線時查看 salesanalyst 使用者的成員資格，請使用下列範例。

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

1. 以 dbadmin 使用者身分連線至資料庫。

1. 若要查看 salesengineer 使用者的成員資格，請使用下列範例。

   ```
   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)。

在本節中，您會建立 RLS 政策以提供許可給 `salesengineer` 使用者，使其只能檢視 `cat` 資料表中 `catdesc` 值為 Major League Baseball 的列。然後您會以 `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. 若要對 `sales_ro` 角色授予 IGNORE RLS 許可，請使用下列範例。這樣就會對 `salesanalyst` 使用者授予忽略 RLS 政策的許可，因為其為 `sales_ro` 角色的成員。

   ```
   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. 若要從 `cat` 資料表分離 RLS 政策，請使用下列範例。

   ```
   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)