视图概览

本主题介绍并描述了 Spanner 视图。

概览

视图是由 SQL 查询定义的虚拟表。创建视图时,您可以指定视图所代表的 SQL 查询。创建视图后,您可以执行引用该视图的查询,就像使用表一样。

执行引用视图的查询时,Spanner 会创建 通过执行视图中定义的查询来创建虚拟表, 表的内容供引用查询使用。

因为定义视图的查询每次都会执行引用 视图在执行后有时称为逻辑视图 以将其与 SQL 具体化视图区分开来 查询结果,该查询将视图定义为数据存储中的实际表。

在 Spanner 中,您可以创建视图作为调用者的权限 视图定义者的权限视图。安全模型 控制用户对视图的访问权限。

调用方的权利视图定义者的权利视图
说明 如果您创建的视图拥有调用者权限,则需要拥有数据库角色。 该视图的权限,以及该视图的所有架构对象 来查询视图。如需了解详情,请参阅 调用方的权利视图 如果您创建的视图具有定义者权限,则需要拥有数据库角色。 权限。使用 精细的访问权限控制以及定义者的权限视图,否则 定义者的权限视图不会添加任何额外的访问权限控制。对于 如需了解详情,请参阅定义者的权利视图
创建视图所需的权限 创建、授予和撤消操作 您必须拥有数据库级访问权限 spanner.database.updateDdl 权限。
查询视图所需的权限 数据库角色需要拥有该视图及其所有底层视图的权限 来查询视图。 数据库角色需要相应视图(且仅需要该视图)的权限才能 查询视图。

视图的优势

与纳入数据视图中定义的查询相比,数据视图具有 应用逻辑

  • 视图可为应用提供逻辑数据建模。

    有时,某些选择对物理数据建模 Spanner 不是最适合用于读取 这些数据。视图可以呈现一个更合适的应用抽象作为备用表架构。

  • 视图可集中管理查询定义,从而简化维护工作。

    通过为广泛使用或复杂的查询创建视图,您可以从应用中分离开查询文本并将其集中。这样做可以使各个应用中的查询文本保持最新,并使修订和调整查询的变更无需更改应用代码。

  • 视图可跨架构更改提供稳定性。

    因为定义视图的查询存储在数据库架构中 Spanner 可以而且确实确保 查询所引用的对象(表、列等)的架构更改 不会使查询失效。

常见使用场景

如果您的 Spanner 数据库包含高特权,请使用视图 某些数据不应向所有数据库用户公开,或者您想要 封装数据

如果您的视图不需要额外的安全功能和所有调用方 视图引用的所有架构对象的访问权限、创建 调用方的权限视图。

如果您想创建一个视图,其中并非所有调用者都有权访问所有架构 对象时,创建定义者的权限视图。定义者 由于 数据库管理员可以为更少的用户提供表和 视图引用的列。定义器的权限视图 需要一种方式来安全地访问 Spanner 的相关子集 数据库。例如,您可能想为 以下数据:

  • 个人账号数据(例如应用客户)。
  • 与角色相关的数据(例如,HR 人员、销售助理)。
  • 与营业地点相关的数据。

调用方的权利视图

如果视图具有调用方的权限,则意味着当用户(调用方)执行 Spanner 会检查用户的权限, 对视图以及视图引用的所有架构对象执行此属性。用户 必须对所有架构对象都拥有特权才能查询视图。

定义者的权利视图

定义者的权限视图可向视图添加额外的安全功能。它 对视图和底层架构对象提供不同的权限。 与调用方的权限视图一样,用户必须要有数据库级权限 创建定义者的权利视图它们的主要区别在于 查询定义者的权限视图时,Spanner 会验证 该角色有权访问视图本身(且只能访问该视图)。因此, 即使查询视图的用户无权访问 它们可以访问该视图并查看其内容。定义者的权利 通过数据视图,用户可以访问最新数据,这些数据仅限于数据视图中定义的行。

Spanner Identity and Access Management (IAM) 权限授予 数据库层级使用精细的访问权限控制 定义者的权限视图,否则定义者的权限视图不会添加 任何其他的访问权限控制这是因为如果用户具有读取权限 因为他们对数据库中的所有架构对象都拥有读取权限 数据库。在对数据库配置精细的访问权限控制后, 拥有该视图的 SELECT 权限的精细访问权限控制用户,以及 对该数据库具有数据库级权限的用户可以查询该视图。通过 不同之处在于,精细的访问权限控制用户不需要特权 底层对象

视图的限制

与实际表相比,视图具有一些限制,因此不适合某些使用场景。

  • 视图是只读的。不能用于添加、更新或删除数据。

    您不能在 DML 语句(INSERTUPDATEDELETE)中使用视图。

  • 定义视图的查询无法使用查询参数。

  • 视图无法编入索引。

  • 对视图的引用不能使用表提示

    但是,定义视图的查询可以在其引用的表上包含表提示。

  • 阅读 API。

  • Spanner 不支持定义者的权利视图 数据提升

    如果在 Data Boost 中运行包含定义者权限视图的查询, 出错。

  • 针对以下查询推荐的查询模式NORMAL 模式访问定义者的权限视图。

    用户无权访问定义器的底层架构对象 在非正常查询模式下查询时,权利视图会收到错误。

  • 用户有可能创建精心设计的查询, Spanner 抛出错误,以指明或揭示存在 定义者的权限视图中未提供的数据。

    例如,假设以下视图具备“EligibleStudentScores” 返回符合某课程条件的学生的分数。使用 资格评估取决于学生的水平和考试分数。如果 学生的水平等于或低于 6 分,分数很重要,但学生 至少需要获得 50 分的考试才有资格参加考试。否则,对于级别 等于或大于 6,则默认情况下,学生符合要求。

      CREATE VIEW QualifiedStudentScores
      SQL SECURITY DEFINER AS
      SELECT
        s.Name,
        s.Level,
        sc.Score
      FROM Students AS s
      JOIN Scores AS sc ON sc.StudentId = s.StudentId
      WHERE
      (CASE
        WHEN (s.Level < 6) OR (s.Level >= 6 AND sc.Score >= 50)
          THEN 'QUALIFIED';
        ELSE 'FAILED';
      END) = 'QUALIFIED';
    

    用户可以运行以下形式的查询: SELECT * FROM QualifiedStudentScores s WHERE s.Level = 7 AND 1/(s.Score - 20) = 1;. 如果以下课程中有学生,则此查询可能会失败并显示除数为零的错误 得分为 20 分的 7 级用户,尽管数据视图限制为 50 分 积分及以上。

使用视图时的查询性能

引用视图的查询与其视图引用被视图定义所取代后的同一查询等效。

适用于视图的配额和限制

  • 配额和限制页面列出了配额和限制 查看专门针对数据视图的信息

  • 在查询中使用视图可能会影响该查询的查询限制,因为视图定义将成为查询的一部分。

费用冲击

使用视图对实例费用的影响非常小:

  • 与将定义的查询文本嵌入到引用它们的查询相比,使用视图对实例的计算容量需求没有影响。

  • 使用视图对实例的数据库存储空间影响极小,因为通过执行视图的查询定义生成的表不会保存到永久性数据库存储空间。

后续步骤