视图概览

本文档介绍并描述了 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)中使用视图。

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

  • 视图无法编入索引。

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

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

  • Read API 不支持视图。

  • Spanner Data Boost 不支持定义方权限视图。

    在 Data Boost 中运行包含定义方权限视图的查询会导致错误。

  • 访问定义方权限视图的推荐查询模式NORMAL 模式。

    如果用户无权访问定义方权限视图的底层架构对象,则在以正常模式之外的查询模式进行查询时会收到错误。

  • 用户可以创建精心设计的查询,使 Spanner 抛出错误,以显示或揭示存在定义方权限视图中不可用的数据。

    例如,假设存在以下视图 QualifiedStudentScores,该视图会返回符合课程资格条件的学生的分数。资格条件取决于学生的级别和考试分数。如果学生的级别等于或低于 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; 形式的查询。如果一个级别为 7 的学生的分数为 20 分,即使视图将该级别的数据限制为 50 分及以上,此查询也可能会因除数为零错误而失败。

使用视图时的查询性能

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

适用于视图的配额和限制

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

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

费用冲击

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

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

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

后续步骤