

# 在 Athena 中使用 Data Catalog 视图
<a name="views-glue"></a>

在 Amazon Athena 中创建 Data Catalog 视图需要特殊的 `CREATE VIEW` 语句。查询它们将使用传统的 SQL `SELECT` 语法。Data Catalog 视图也称为*多方言*视图或 MDV。

## 创建 Data Catalog 视图
<a name="views-glue-creating-a-data-catalog-view"></a>

要在 Athena 中创建 Data Catalog 视图，请使用以下语法。

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW view_name 
SECURITY DEFINER 
[ SHOW VIEW JSON ]
AS athena-sql-statement
```

**注意**  
`SHOW VIEW JSON` 选项仅适用于 Data Catalog 视图，不适用于 Athena 视图。使用 `SHOW VIEW JSON` 选项执行“空运行”，以验证输入，如果验证成功，则返回将代表视图的 Amazon Glue 表对象的 JSON。实际视图未创建。如果未指定 `SHOW VIEW JSON` 选项，则会进行验证，并在 Data Catalo 中照常创建视图。

以下示例展示 `Definer` 角色的用户如何创建 `orders_by_date` Data Catalog 视图。该示例假设 `Definer` 角色对 `default` 数据库中的 `orders` 表具有完全 `SELECT` 权限。

```
CREATE PROTECTED MULTI DIALECT VIEW orders_by_date 
SECURITY DEFINER 
AS 
SELECT orderdate, sum(totalprice) AS price 
FROM orders 
WHERE order_city = 'SEATTLE' 
GROUP BY orderdate
```

有关语法信息，请参阅[CREATE PROTECTED MULTI DIALECT VIEW](create-view.md#create-protected-multi-dialect-view)。

## 查询 Data Catalog 视图
<a name="views-glue-querying-a-data-catalog-view"></a>

视图创建后，`Lake Formation` 管理员可以向 `Invoker` 主体授予对 Data Catalog 视图的 `SELECT` 权限。然后，`Invoker` 主体无需访问视图所引用的基础基表，即可查询视图。以下是 `Invoker` 查询示例。

```
SELECT * from orders_by_date where price > 5000
```

## 注意事项和限制
<a name="views-glue-limitations"></a>

以下大多数 Data Catalog 视图限制特定于 Athena。有关同样适用于其他服务的 Data Catalog 视图的其他限制，请参阅 Lake Formation 文档。
+ Data Catalog 视图不能引用其他视图、数据库资源链接或表资源链接。
+ 在视图定义中，您最多可以引用 10 个表。
+ 在 Lake Formation 中，表不得具有 `IAMAllowedPrincipals` 数据湖权限。如果有，则会出现错误“多方言视图只能引用没有 IAMAllowedPrincipals 权限的表”。
+ 该表的 Amazon S3 位置必须注册为 Lake Formation 数据湖位置。如果该表未按此方式注册，则会出现错误“多方言视图只能引用 Lake Formation 托管表”。有关如何在 Lake Formation 中注册 Amazon S3 位置的信息，请参阅*Amazon Lake Formation开发者指南*中的[注册 Amazon S3 位置](https://docs.amazonaws.cn/lake-formation/latest/dg/register-location.html)。
+ Amazon Glue[GetTables](https://docs.amazonaws.cn/glue/latest/webapi/API_GetTables.html) 和 [SearchTables](https://docs.amazonaws.cn/glue/latest/webapi/API_SearchTables.html) API 调用不会更新 `IsRegisteredWithLakeFormation` 参数。要查看参数的正确值，请使用 Amazon Glue [GetTable](https://docs.amazonaws.cn/glue/latest/webapi/API_GetTable.html) API。有关更多信息，请参阅*Amazon Lake Formation开发者指南*中的 [GetTables 和 SearchTables API 不会更新 IsRegisteredWithLakeFormation 参数的值](https://docs.amazonaws.cn/lake-formation/latest/dg/limitations.html#issue-GetTables-value)。
+ `DEFINER` 主体只能是 IAM 角色。
+ `DEFINER` 角色必须对基础表具有完全的 `SELECT`（可授予）权限。
+ 不支持 `UNPROTECTED` Data Catalog 视图。
+ 视图定义中不支持用户定义的函数（UDF）。
+ Athena 联合数据来源不能用于 Data Catalog 视图。
+ 外部 Hive 元存储不支持 Data Catalog 视图。
+ Athena 在检测到过时视图时会显示错误消息。发生以下一种情况时，会报告过时的视图：
  + 视图引用了不存在的表或数据库。
  + 在引用的表中进行了架构或元数据更改。
  + 删除了引用的表并使用不同的架构或配置重新创建。

## 权限
<a name="views-glue-permissions"></a>

Data Catalog 视图需要三个角色：`Lake Formation Admin`、`Definer` 和 `Invoker`。
+ **`Lake Formation Admin`** – 有权配置所有 Lake Formation 权限。
+ **`Definer`** – 创建 Data Catalog 视图。`Definer` 角色必须对视图定义引用的所有基础表具有完全的可授予 `SELECT` 权限。
+ **`Invoker`** – 可以查询 Data Catalog 视图或检查其元数据。若要显示查询的调用者，可以使用 `invoker_principal()` DML 函数。有关更多信息，请参阅 [invoker\$1principal()](functions-env3.md#functions-env3-invoker-principal)。

`Definer` 角色的信任关系必须允许 Amazon Glue 和 Lake Formation 服务主体采取 `sts:AssumeRole` 操作。有关更多信息，请参阅《Amazon Lake Formation 开发人员指南》**中的[创建视图的先决条件](https://docs.amazonaws.cn/lake-formation/latest/dg/working-with-views.html#views-prereqs)。

还需要针对 Athena 访问的 IAM 权限。有关更多信息，请参阅 [Amazon Athena 的 Amazon 托管策略](security-iam-awsmanpol.md)。