本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Lake Formation 中的数据筛选条件
您可以通过创建数据筛选条件来实现列级别、行级别和单元格级别安全性。在授予对表的 SELECT
Lake Formation 权限时,您可以选择数据筛选条件。如果您的表包含嵌套列结构,则可以通过包含或排除子列来定义数据筛选条件,并针对嵌套属性定义行级别筛选表达式。
每个数据筛选条件属于数据目录中的一个特定表。数据筛选条件包含以下信息。
-
筛选条件名称
-
与筛选条件关联的表的目录 ID
-
表名称
-
包含表的数据库的名称
-
列规范 – 要在查询结果中包含或排除的列和嵌套列的列表(使用
struct
数据类型)。 -
行筛选表达式 – 用于指定要包含在查询结果中的行的表达式。由于实施一些限制,该表达式的语法与 PartiQL 语言中
WHERE
子句的语法相同。要指定所有行,请选择控制台的行级别访问下的访问所有行,或者在 API 调用中使用AllRowsWildcard
。有关行筛选表达式支持哪些内容的更多信息,请参阅行筛选表达式支持 PartiQL。
您获得的筛选级别取决于填充数据筛选器的方式。
-
如果指定“所有列”通配符并提供行筛选条件表达式,则仅建立行级安全性(行筛选)。
-
如果包含或排除特定列和嵌套列并使用“所有行”通配符指定所有行,则仅会建立列级别安全性(列筛选)。
-
如果包含或排除特定列,同时提供行筛选条件表达式,则建立单元格级别的安全性(单元格筛选)。
以下来自 Lake Formation 控制台的屏幕截图显示了执行单元格级别筛选的数据筛选条件。对于针对 orders
表的查询,它会限制对 customer_name
列的访问,并且查询结果仅返回 product_type
列包含“pharma”的行。
请注意使用单引号将字符串 'pharma'
引起来。
您可以使用 Lake Formation 控制台创建此数据筛选条件,也可以向 CreateDataCellsFilter
API 操作提供以下请求对象。
{ "Name": "restrict-pharma", "DatabaseName": "sales", "TableName": "orders", "TableCatalogId": "111122223333", "RowFilter": {"FilterExpression": "product_type='pharma'"}, "ColumnWildcard": { "ExcludedColumnNames": ["customer_name"] } }
您可以根据需要为表创建许多数据筛选条件。为此,您需要使用授权选项授予对表的 SELECT
权限。默认情况下,数据湖管理员有权在该账户中的所有表上创建数据筛选条件。在向主体授予对表的权限时,通常只使用一部分可能的数据筛选条件。例如,您可以为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"] }
然后,您可以使用 restrict-pharma
数据筛选条件向管理用户授予对 orders
表的 SELECT
,并使用 no-pharma
数据筛选条件向非管理用户授予对 orders
表的 SELECT
。对于医疗保健业的用户,您可以授予对 orders
表的 SELECT
以及对所有行和列的完整访问权限(没有数据筛选条件),或者还可以使用数据筛选条件来限制对定价信息的访问。
在数据筛选条件中指定列级别和行级别安全性时,可以包含或排除嵌套列。在以下示例中,使用限定列名称(用双引号括起来)指定对该 product.offer
字段的访问权限。这对于嵌套字段很重要,这样可以避免在列名称包含特殊字符时发生错误,并保持与顶级列级别安全性定义的向后兼容性。
{ "Name": "example_dcf", "DatabaseName": "example_db", "TableName": "example_table", "TableCatalogId": "111122223333", "RowFilter": { "FilterExpression": "customer.customerName <> 'John'" }, "ColumnNames": ["customer", "\"product\".\"offer\""] }