本页面介绍了如何创建和管理 Spanner 视图。有关 如需了解 Spanner 视图,请参阅视图简介。
权限
要创建、授予和撤消对视图的访问权限,您必须拥有
spanner.database.updateDdl
权限。
创建视图
如需创建视图,请使用 DDL 语句
CREATE VIEW
,用于为
视图并提供定义它的查询。此语句有两种形式:
CREATE VIEW
用于定义当前数据库中的新视图。如果名为view_name
的视图已存在,则CREATE VIEW
语句将失败。CREATE OR REPLACE VIEW
用于定义当前数据库中的新视图。如果已经存在名为view_name
的视图,则其定义会被替换。
CREATE VIEW 语句的语法如下:
{CREATE | CREATE OR REPLACE } VIEW view_name SQL SECURITY { INVOKER | DEFINER } AS query
由于视图是虚拟表,因此您执行的 query
必须指定该虚拟表中的所有列的名称。
此外,Spanner 还会检查 query
您使用严格名称解析指定,这意味着所有架构对象名称
查询中使用的字符必须经过限定,
单个架构对象。例如,Singers
表的 SingerId
列后面的示例必须限定为 Singers.SingerId
。
您必须将 SQL SECURITY
指定为 INVOKER
或 DEFINER
,
CREATE VIEW
或 CREATE OR REPLACE VIEW
语句。如需详细了解
这两种安全类型之间的区别,请参阅视图简介。
例如,假设 Singers
表的定义如下所示:
GoogleSQL
CREATE TABLE Singers ( SingerId INT64 NOT NULL, FirstName STRING(1024), LastName STRING(1024), SingerInfo BYTES(MAX) ) PRIMARY KEY (SingerId);
PostgreSQL
CREATE TABLE Singers ( SingerId BIGINT PRIMARY KEY, FirstName VARCHAR(1024), LastName VARCHAR(1024), SingerInfo BYTEA );
您可以按如下方式定义具有调用方权限的 SingerNames
视图:
CREATE VIEW SingerNames SQL SECURITY INVOKER AS SELECT Singers.SingerId AS SingerId, Singers.FirstName || ' ' || Singers.LastName AS Name FROM Singers;
在查询中使用 SingerNames
视图时创建的虚拟表包含 SingerId
和 Name
列。
虽然此 SingerNames
视图的定义有效,但没有遵循数据类型转换的最佳做法,该最佳做法旨在确保架构更改的稳定性,如下一部分所述。
创建视图时的最佳做法
要尽量减少更新视图定义的需求,请在定义视图的查询中显式类型转换所有表列的数据类型。执行此操作后,视图的定义在列类型架构更改时可保持有效。
例如,以下 SingerNames
视图定义可能变为
因为更改了 Singers
表中列的数据类型。
CREATE VIEW SingerNames SQL SECURITY INVOKER AS SELECT Singers.SingerId AS SingerId, Singers.FirstName || ' ' || Singers.LastName AS Name FROM Singers;
您可以通过将列显式转换为 所需的数据类型,如下所示:
GoogleSQL
CREATE OR REPLACE VIEW SingerNames SQL SECURITY INVOKER AS SELECT CAST(Singers.SingerId AS INT64) AS SingerId, CAST(Singers.FirstName AS STRING) || " " || CAST(Singers.LastName AS STRING) AS Name FROM Singers;
PostgreSQL
CREATE OR REPLACE VIEW SingerNames SQL SECURITY INVOKER AS SELECT CAST(Singers.SingerId AS bigint) AS SingerId, CAST(Singers.FirstName AS varchar) || ' ' || CAST(Singers.LastName AS varchar) AS Name FROM Singers;
授予和撤消对视图的访问权限
作为精细的访问权限控制用户,您必须拥有以下各项的 SELECT
权限:
一个视图。如需将某个视图的 SELECT
权限授予数据库角色,请执行以下操作:
GoogleSQL
GRANT SELECT ON VIEW SingerNames TO ROLE Analyst;
PostgreSQL
GRANT SELECT ON TABLE SingerNames TO Analyst;
如需撤消某个数据库角色对某个视图的 SELECT
权限,请执行以下操作:
GoogleSQL
REVOKE SELECT ON VIEW SingerNames FROM ROLE Analyst;
PostgreSQL
REVOKE SELECT ON TABLE SingerNames FROM Analyst;
查询视图
查询调用方权限和定义者权限视图的方式是相同的。 然而,根据视图的安全类型,Spanner 可能需要(也可能不需要)检查视图中引用的架构对象 调用查询的主账号的数据库角色。
查询调用方的权限视图
如果视图具有调用方的权限,则用户必须拥有所有底层底层的 架构对象以进行查询。
例如,如果数据库角色有权访问
SingerNames
视图,则可以查询 SingerNames
视图:
SELECT COUNT(SingerID) as SingerCount FROM SingerNames;
查询定义者的权限视图
如果某个视图具有定义者的权限,则用户无需
授予所需的角色
针对该视图的 SELECT
权限。
在以下示例中,具有“分析师”数据库角色的用户想要查询
SingerNames
视图。不过,由于SingerNames
,系统拒绝了用户访问
是调用方的权限视图,而“分析师”角色无权访问
底层对象。在这种情况下,如果您决定向分析师提供
访问该视图,但不希望为其提供对 Singers
的访问权限
您可以将视图的安全类型替换为
的权利。替换视图的安全类型后,
拥有对视图的 Analyst 角色访问权限。用户现在可以查询 SingerNames
视图
即使他们无权访问 Singers
表也是如此。
SELECT COUNT(SingerID) as SingerCount FROM SingerNames;
替换视图
您可以使用 CREATE OR REPLACE VIEW
语句来更改视图,
视图定义或视图的安全类型。
替换视图与丢弃并重新创建视图类似。任意访问权限 必须重新向初始视图授予 视图。
如需将调用方的权限视图替换为定义者的权限视图,请执行以下操作:
CREATE OR REPLACE VIEW SingerNames SQL SECURITY DEFINER AS SELECT Singers.SingerId AS SingerId, Singers.FirstName || ' ' || Singers.LastName AS Name FROM Singers;
删除视图
某个视图被删除后,对该视图拥有权限的数据库角色将不再
访问权限。如需删除视图,请使用 DROP VIEW
语句。
DROP VIEW SingerNames;
获取视图的相关信息
您可以通过查询数据库中的表
INFORMATION_SCHEMA
架构。
INFORMATION_SCHEMA.TABLES
表提供所有已定义视图的名称。INFORMATION_SCHEMA.VIEWS
表提供项目的名称、视图定义、安全类型和查询文本 所有已定义的数据视图对数据视图拥有SELECT
权限的 FGAC 用户 可以从INFORMATION_SCHEMA.VIEWS
表中获取有关视图的信息。 其他 FGAC 用户需要spanner_info_reader
角色(如果他们没有该角色) 该视图的“SELECT
”权限。
如需查看名为
ProductSoldLastWeek
:
SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'ProductSoldLastWeek';