视图概览

本主题介绍了 Spanner 视图。

概览

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

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

由于每次执行引用视图的查询时,都会执行定义视图的查询,因此视图有时也称为逻辑视图或动态视图,以将其与 SQL 具体化视图区分开来。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 中运行包含定义者权限视图的查询, 出错。

  • 针对以下查询推荐的查询模式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;。 如果第 7 级别中有学生的分数为 20 分,则此查询可能会失败并显示除零错误,即使该视图将该级别的数据限制为 50 分及以上。

使用视图时的查询性能

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

适用于视图的配额和限制

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

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

费用冲击

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

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

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

后续步骤