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