

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Lake Formation 中的資料篩選和儲存格層級安全性
<a name="data-filtering"></a>

當您授予資料目錄資料表的 Lake Formation 許可時，您可以包含資料篩選規格，以限制對與 Lake Formation 整合之查詢結果和引擎中特定資料的存取。Lake Formation 使用資料篩選來實現資料欄層級安全性、資料列層級安全性和儲存格層級安全性。如果您的來源資料包含巢狀結構，您可以在巢狀資料欄上定義和套用資料篩選條件。

透過 Lake Formation 的資料篩選功能，您可以實作以下層級的資料安全。

**資料欄層級安全**  
對資料目錄資料表授予具有資料欄層級安全性 （資料欄篩選） 的許可，可讓使用者僅檢視其在資料表中可存取的特定資料欄和巢狀資料欄。考慮在大型多區域通訊公司的多個應用程式中使用的`persons`資料表。使用欄篩選授予資料目錄資料表的許可可以限制不在 HR 部門工作的使用者查看個人身分識別資訊 (PII)，例如社會安全號碼或出生日期。您也可以定義安全政策，並僅授予對巢狀資料欄部分子結構的存取權。

**資料列層級安全性**  
對資料目錄資料表授予具有資料列層級安全性 （資料列篩選） 的許可，可讓使用者僅檢視其在資料表中可存取的特定資料列。篩選是根據一或多個資料欄的值。您可以在定義資料列篩選條件表達式時包含巢狀資料欄結構。例如，如果通訊公司的不同區域辦公室有自己的 HR 部門，您可以將 HR 員工可以看到的人員記錄限制為僅限其區域中員工的記錄。

**儲存格層級安全性**  
儲存格層級安全性結合了資料列篩選和資料欄篩選，可提供高度彈性的許可模型。如果您使用儲存格層級安全性將資料表的資料列和資料欄檢視為網格，則可以限制存取兩個維度中的任何位置的網格個別元素 （儲存格）。也就是說，您可以根據資料列限制對不同資料欄的存取。這由下圖說明，其中限制的資料欄會著色。

![網格會顯示 5 列和 6 欄。資料列和資料欄具有 Col1, Col2, Row1, Row2 等標頭。具有下列座標的網格儲存格會著色：R3,C1; R3,C2; R3,C3; R5,C1; R5;C2; R5,C5; R5,C6。](http://docs.aws.amazon.com/zh_tw/lake-formation/latest/dg/images/cells-diagram.png)


繼續人員資料表的範例，您可以在儲存格層級建立*資料篩選條件*，如果資料列的國家/地區資料欄設定為 "UK"，則限制對街道地址資料欄的存取，但如果資料列的國家/地區資料欄設定為 "US"，則允許存取街道地址資料欄。

篩選條件僅適用於讀取操作。因此，您只能使用篩選條件授予 `SELECT` Lake Formation 許可。

**巢狀資料欄上的儲存格層級安全性**  
Lake Formation 可讓您在巢狀資料欄上定義和套用具有儲存格層級安全性的資料篩選條件。不過，Amazon Athena、Amazon EMR 和 Amazon Redshift Spectrum 等整合分析引擎支援對具有資料列和資料欄層級安全性的 Lake Formation 受管巢狀資料表執行查詢。

如需限制的詳細資訊，請參閱[資料篩選限制](data-filtering-notes.md)。

**Topics**
+ [Lake Formation 中的資料篩選條件](#data-filters-about)
+ [資料列篩選條件表達式中的 PartiQL 支援](partiql-support.md)
+ [使用儲存格層級篩選查詢資料表所需的許可](row-filtering-prereqs.md)
+ [管理資料篩選條件](managing-filters.md)

## Lake Formation 中的資料篩選條件
<a name="data-filters-about"></a>

您可以建立*資料篩選條件*，來實作資料欄層級、資料列層級和儲存格層級安全性。當您授予資料表的 `SELECT` Lake Formation 許可時，請選取資料篩選條件。如果您的資料表包含巢狀資料欄結構，您可以透過包含或排除子資料欄來定義資料篩選條件，並在巢狀屬性上定義資料列層級篩選條件表達式。



每個資料篩選條件都屬於 Data Catalog 中的特定資料表。資料篩選條件包含下列資訊：
+ 篩選器名稱
+ 與篩選條件相關聯的資料表目錄 IDs 
+ 資料表名稱
+ 包含資料表的資料庫名稱
+ 資料欄規格 – 要包含或排除在查詢結果中的資料欄和巢狀資料欄 （含`struct`資料類型） 的清單。
+ 資料列篩選條件表達式 – 指定要包含在查詢結果中的資料列的表達式。在某些限制下，表達式具有 PartiQL 語言中 `WHERE`子句的語法。若要指定所有資料列，請在主控台中選擇存取資料列層級存取下**的所有資料**列，或在 API 呼叫`AllRowsWildcard`中使用 。 ****

  如需資料列篩選條件表達式中所支援內容的詳細資訊，請參閱 [資料列篩選條件表達式中的 PartiQL 支援](partiql-support.md)。

您取得的篩選層級取決於資料篩選條件的填入方式。
+ 如果您指定「所有資料行」萬用字元並提供資料列篩選條件運算式，則只會建立資料列層級安全性 (資料列篩選)。
+ 當您包含或排除特定資料欄和巢狀資料欄，並使用全列萬用字元指定「所有資料列」時，您只會建立資料欄層級的安全性 （資料欄篩選）。
+ 如果包含或排除特定資料行並提供資料列篩選條件運算式，則會建立儲存格層級安全性 (儲存格篩選)。

下列 Lake Formation 主控台的螢幕擷取畫面顯示執行儲存格層級篩選的資料篩選條件。對於針對`orders`資料表的查詢，它會限制對 `customer_name`欄的存取，而查詢結果只會傳回包含 'pharma' `product_type`欄的資料列。

![資料篩選條件視窗包含這些垂直排列的欄位：資料篩選條件名稱；目標資料庫；目標資料表；具有選項的選項按鈕群組 存取所有欄、包含欄和排除欄；選取欄 （下拉式清單）；資料列篩選條件表達式 （多行文字方塊）。選取排除資料欄選項，選取 customer_name 資料欄進行排除，且資料列篩選條件表達式欄位包含 'product_type='pharma'。](http://docs.aws.amazon.com/zh_tw/lake-formation/latest/dg/images/data-filter-sample-pharma.png)


請注意，使用單引號括住字串常值 `'pharma'`。

您可以使用 Lake Formation 主控台來建立此資料篩選條件，也可以將下列請求物件提供給 `CreateDataCellsFilter` API 操作。

```
{
     "Name": "restrict-pharma",
     "DatabaseName": "sales",
     "TableName": "orders",
     "TableCatalogId": "111122223333",      
     "RowFilter": {"FilterExpression": "product_type='pharma'"},
     "ColumnWildcard": {
         "ExcludedColumnNames": ["customer_name"]
     }
}
```

您可以視需要為資料表建立任意數量的資料篩選條件。若要這樣做，您需要資料表上具有授予選項的`SELECT`許可。根據預設，Data Lake 管理員具有在該帳戶中的所有資料表上建立*資料篩選條件*的許可。您通常只會在將資料表的許可授予委託人時，使用可能的資料篩選條件子集。例如，您可以為`orders`資料表建立第二個資料篩選條件，這是row-security-only的資料篩選條件。請參閱上述螢幕擷取畫面，您可以選擇**存取所有資料欄**選項，並包含 的資料列篩選條件表達式`product_type<>pharma`。此資料篩選條件的名稱可以是 `no-pharma`。它會限制對資料`product_type`欄設定為 'pharma' 的所有資料列的存取。

此資料篩選條件的 `CreateDataCellsFilter` API 操作請求物件如下。

```
{
     "Name": "no-pharma",
     "DatabaseName": "sales",
     "TableName": "orders",
     "TableCatalogId": "111122223333",      
     "RowFilter": {"FilterExpression": "product_type<>'pharma'"},
     "ColumnNames": ["customer_id", "customer_name", "order_num"
          "product_id", "purchase_date", "product_type", 
          "product_manufacturer", "quantity", "price"]
}
```

然後，您可以將`orders`資料表`SELECT`上的`restrict-pharma`資料篩選條件授予管理使用者，將`orders`資料表`SELECT`上的`no-pharma`資料篩選條件授予非管理使用者。對於醫療保健領域中的使用者，您可以在`orders`資料表`SELECT`上授予 ，以完整存取所有資料列和資料欄 （無資料篩選條件），或者使用另一個限制對定價資訊的存取的資料篩選條件。

 在資料篩選條件中指定資料欄層級和資料列層級安全性時，您可以包含或排除巢狀資料欄。在下列範例中，使用合格的資料欄名稱 （以雙引號包裝） 指定對 `product.offer` 欄位的存取。這對於巢狀欄位很重要，以避免資料欄名稱包含特殊字元時發生錯誤，並維持與最上層資料欄層級安全定義的回溯相容性。

```
{
     "Name": "example_dcf",
     "DatabaseName": "example_db",
     "TableName": "example_table",
     "TableCatalogId": "111122223333",      
     "RowFilter": { "FilterExpression": "customer.customerName <> 'John'" },
     "ColumnNames": ["customer", "\"product\".\"offer\""]
}
```

**另請參閱**  
[管理資料篩選條件](managing-filters.md)