本主题介绍并描述了 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 语句(
INSERT
、UPDATE
、DELETE
)中使用视图。定义视图的查询无法使用查询参数。
视图无法编入索引。
对视图的引用不能使用表提示。
但是,定义视图的查询可以在其引用的表上包含表提示。
Read API 不支持视图。
Spanner Data Boost 不支持定义器的权限视图。
在 Data Boost 中运行包含定义者权限视图的查询会导致错误。
访问定义者的权限视图的建议查询模式为
NORMAL
模式。以非正常查询模式进行查询时,如果用户无权访问定义者权限视图的底层架构对象,则会收到错误。
用户可能会创建一个精心设计的查询,导致 Spanner 抛出错误,并显示或显示定义者的权限视图中不存在的数据。
例如,假设以下视图 CompleteStudentScores 可返回符合课程条件的学生的分数。取得资格的标准视学生的等级和考试得分而定。如果学生的水平等于或低于 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 分及以上)。
使用视图时的查询性能
引用视图的查询与其视图引用被视图定义所取代后的同一查询等效。
适用于视图的配额和限制
费用影响
使用视图对实例费用的影响非常小:
与将定义的查询文本嵌入到引用它们的查询相比,使用视图对实例的计算容量需求没有影响。
使用视图对实例的数据库存储空间影响极小,因为通过执行视图的查询定义生成的表不会保存到永久性数据库存储空间。
后续步骤
- 不妨了解如何创建和管理数据视图。