在 Databricks SQL 中配置具体化视图

本文介绍如何在 Databricks SQL 中配置具体化视图,包括对结果的访问控制。 创建具体化视图时可以通过 CREATE OR REPLACE MATERIALIZED VIEW 语句进行大多数配置,或者在创建之后,可以通过 ALTER TABLE 语句进行配置。

描述具体化视图

若要检索具体化视图的列和数据类型,请使用 DESCRIBE 语句。 若要检索具体化视图的列、数据类型和元数据,例如所有者、位置、创建时间和刷新状态,请使用 DESCRIBE EXTENDED。 若要提交 DESCRIBE 语句,请在 Azure Databricks UI、 Databricks SQL CLIDatabricks SQL API 中使用 SQL 编辑器。

使用目录资源管理器获取有关具体化视图的详细信息

您也可以使用目录资源管理器来查看具体化视图的详细信息。

  1. 点击边栏中的“数据”图标目录
  2. 在左侧的目录资源管理器树中,打开目录并选择具体化视图所在的架构。
  3. 打开所选架构下的 “表 ”项,然后单击具体化视图。

在此处,可以使用具体化视图名称下的选项卡查看和编辑有关具体化视图的信息,包括:

  • 更新状态与时间表
  • 请参阅管道详细信息以查看刷新历史记录,以及每个刷新的详细日志。 单击“概述”选项卡中的“查看刷新详细信息”以查看管道详细信息。
  • 表架构
  • 示例数据(需要活动计算)
  • Permissions
  • 世系,包括此具体化视图所依赖的表和管道
  • 深入了解使用情况
  • 你为此具体化视图创建的监控器

在目录资源管理器中,有几个表的属性不可用。 对于这些属性,或者要以编程方式获取信息,可以使用 DESCRIBE EXTENDED 命令。

更新具体化视图的定义

指定具体化视图的查询是其定义。 若要更改具体化视图的定义,请编辑查询,或者使用相同的视图名称创建新的 CREATE 或 REPLACE MATERIALIZED VIEW 查询,然后运行它。 执行完整刷新以更新物化视图,后续刷新使用新定义。

更改具体化视图的所有者

如果你既是元存储管理员,又是工作区管理员,则可以更改具体化视图的所有者。具体化视图会自动创建和使用 Lakeflow 声明性管道来处理更改。 使用以下步骤更改具体化视图所有者:

  • 目录资源管理器中打开具体化视图,然后在“ 概述 ”选项卡上,单击“ 查看刷新详细信息”。 这会打开管理具体化视图的管道的管道详细信息。
  • 单击“共享”。 此时会显示 “权限设置” 对话框。 要编辑这些设置,您必须是元存储和工作区的管理员。
  • 单击当前所有者名称右侧的 x 以删除当前所有者。
  • 开始键入以筛选可用用户列表。 单击应为新管道所有者的用户。
  • 单击“ 保存” 保存更改并关闭对话框。

所有管道资产(包括管道中定义的具体化视图)都归新管道所有者所有。 所有将来的更新都使用新所有者的标识运行。

当所有者丧失源表权限时

如果更改所有者,并且新所有者无权访问源表(或 SELECT 对基础源表撤消特权),用户仍可查询具体化视图。 然而:

  • 它们不能 REFRESH 具体化视图。
  • 具体化视图的下一次计划刷新将失败。

失去对源数据的访问权限会阻止更新,但不会立即使现有具体化视图失效,无法读取。

控制对具体化视图的访问

具体化视图支持丰富的访问控制来支持数据共享,同时避免公开潜在的私有数据。 具体化视图所有者或具有 MANAGE 特权的用户可以向其他用户授予 SELECT 权限。 有权 SELECT 访问具体化视图的用户不需要 SELECT 访问具体化视图引用的表。 此访问控制支持数据共享,同时控制对基础数据的访问。

向具体化视图授予特权

若要授予对具体化视图的访问权限,请使用 GRANT 语句

GRANT <privilege_type> ON <mv_name> TO <principal>;

privilege_type 可以是:

  • SELECT - 用户可以 SELECT 具体化视图。
  • REFRESH - 用户可以 REFRESH 具体化视图。 刷新是使用所有者的权限运行的。

以下示例创建具体化视图并向用户授予选择和刷新权限:

CREATE MATERIALIZED VIEW mv_name AS SELECT * FROM source_table;

-- Grant read-only access:
GRANT SELECT ON mv_name TO read_only_user;

-- Grand read and refresh access:
GRANT SELECT ON mv_name TO refresh_user;
GRANT REFRESH ON mv_name TO refresh_user;

从具体化视图撤消特权

若要从具体化视图撤消访问权限,请使用 REVOKE 语句

REVOKE privilege_type ON <mv_name> FROM principal;

当从具体化视图的所有者或任何已被授予对具体化视图的MANAGESELECT特权的用户撤销源表的SELECT特权,或者源表被删除时,具体化视图的所有者或被授予访问权限的用户仍然可以查询具体化视图。 但是,会发生以下行为:

  • 具体化视图所有者或失去具体化视图访问权限的其他人无法再 REFRESH 获得具体化视图,具体化视图将变得过时。
  • 如果计划自动执行,则下一个计划 REFRESH 失败或未运行。

以下示例从 SELECT 撤销了 read_only_user 权限:

REVOKE SELECT ON mv_name FROM read_only_user;

设置运行时通道

使用 SQL 仓库创建的具体化视图使用管道自动刷新。 Lakeflow 声明式管道默认使用 current 频道中的运行时。 请参阅 Lakeflow 声明性管道发行说明和发布升级过程 ,了解发布过程。

Databricks 建议使用 current 通道来处理生产工作负荷。 新功能首先发布到 preview 频道。 可以将管道设置为预览 Lakeflow 声明性管道通道,以通过指定 preview 为表属性来测试新功能。 可以在创建表时或使用 ALTER 语句创建表后指定此属性。

下面的代码示例演示如何在 CREATE 语句中将通道设置为预览:

CREATE OR REPLACE MATERIALIZED VIEW sales
TBLPROPERTIES ('pipelines.channel' = 'preview')
  AS ...

若要在创建后更改通道,请使用 ALTER TABLE 语句:

ALTER TABLE <table-name> SET TBLPROPERTIES ('pipelines.channel' = 'preview');