视图概览

本主题介绍了 Spanner 视图。

概览

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

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

由于每次执行引用视图的查询时,都会执行定义视图的查询,因此视图有时也称为逻辑视图或动态视图,以将其与 SQL 具体化视图区分开来。SQL 具体化视图会将定义视图的查询结果存储为数据存储空间中的实际表。

在 Spanner 中,您可以将视图创建为调用方的权限视图定义方的权限视图。这两种安全模型用于控制用户对视图的访问权限。

调用方的权限视图定义者权限视图
说明 如果您使用调用方的权限创建视图,则数据库角色需要对视图以及视图引用的所有架构对象拥有权限,才能查询该视图。如需了解详情,请参阅调用方的权限视图 如果您使用定义者权限创建视图,则数据库角色需要对该视图(仅限该视图)拥有权限,才能查询该视图。请将精细访问权限控制与定义者的权限视图搭配使用,否则定义者的权限视图不会添加任何其他访问权限控制。如需了解详情,请参阅定义者权限视图
创建视图所需的权限 如需创建、授予和撤消对这两种视图类型的访问权限,您必须拥有数据库级 spanner.database.updateDdl 权限。
查询视图所需的权限 数据库角色需要对视图及其所有底层架构对象拥有特权,才能查询视图。 数据库角色需要对视图(仅限视图)拥有权限,才能查询视图。

视图的优势

与在应用逻辑中添加定义的查询相比,视图具有一些优势。

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

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

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

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

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

    由于定义视图的查询存储在数据库架构中(而不是应用逻辑中),因此 Spanner 可以确保查询所引用对象(表、列等等)的架构更改不会使查询失效。

常见使用场景

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

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

如果您要创建一个视图,其中并非所有调用方都拥有对该视图引用的所有架构对象的访问权限,请创建定义者的权限视图。定义者权限视图受到更好的保护,并且具有更多限制,因为数据库管理员可以向更少的用户授予对视图中引用的表和列的权限。当用户需要以安全的方式访问 Spanner 数据库的相关子集时,定义者的权限视图非常有用。例如,您可能需要为以下数据创建定义者权利视图:

  • 个人账号数据(例如应用客户)。
  • 角色专用数据(例如,人力资源人员、销售助理)。
  • 特定于地理位置的数据。

调用方的权限视图

如果视图具有调用方的权限,则表示当用户(调用方)对视图执行查询时,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 分及以上。

使用视图时的查询性能

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

适用于视图的配额和限制

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

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

费用冲击

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

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

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

后续步骤