本页面介绍如何创建、使用和删除命名架构,以及如何对命名架构中的对象应用精细访问权限控制。如需大致了解命名架构,请参阅命名架构。
准备工作
如需执行本页面上的过程,您需要满足以下前提条件:
- 您的用户账号具有 Database Admin roles/spanner.databaseAdmin 角色。
- 了解精细访问权限控制的运作方式。
创建命名架构
CREATE SCHEMA
命令(GoogleSQL 和 PostgreSQL)用于创建命名架构。
在 Google Cloud 控制台中,打开 Spanner 页面。
从列表中选择一个实例。
选择数据库。
在导航菜单中,点击 Spanner Studio。
点击
新的 SQL 编辑器标签页或 新标签页以打开新标签页。在编辑器标签页中,输入 DDL。
GoogleSQL
运行
CREATE SCHEMA
语句以创建命名架构,例如:CREATE SCHEMA sch1;
在命名架构中添加数据库对象,例如:
CREATE SEQUENCE sch1.sequence OPTIONS ( sequence_kind = 'bit_reversed_positive' ); CREATE TABLE Singers ( SingerId INT64 NOT NULL, FirstName STRING(1024), LastName STRING(1024), SingerInfo BYTES(MAX), ) PRIMARY KEY(SingerId); CREATE INDEX indexOnSingers ON Singers(FirstName); CREATE TABLE Albums ( SingerId INT64 NOT NULL, AlbumId INT64 NOT NULL, AlbumTitle STRING(MAX), ) PRIMARY KEY(SingerId, AlbumId), INTERLEAVE IN PARENT Singers ON DELETE CASCADE; CREATE TABLE Songs ( SingerId INT64 NOT NULL, AlbumId INT64 NOT NULL, TrackId INT64 NOT NULL, SongName STRING(MAX), ) PRIMARY KEY(SingerId, AlbumId, TrackId), INTERLEAVE IN PARENT Albums ON DELETE CASCADE; CREATE TABLE sch1.Singers ( SingerId INT64 NOT NULL, FirstName STRING(1024), LastName STRING(1024), SingerInfo BYTES(MAX), ) PRIMARY KEY(SingerId); CREATE INDEX sch1.indexOnSingers ON sch1.Singers(FirstName); CREATE TABLE sch1.Albums ( SingerId INT64 NOT NULL, AlbumId INT64 NOT NULL, AlbumTitle STRING(MAX), ) PRIMARY KEY(SingerId, AlbumId), INTERLEAVE IN PARENT sch1.Singers ON DELETE CASCADE; CREATE TABLE sch1.Songs ( SingerId INT64 NOT NULL, AlbumId INT64 NOT NULL, TrackId INT64 NOT NULL, SongName STRING(MAX), ) PRIMARY KEY(SingerId, AlbumId, TrackId), INTERLEAVE IN PARENT sch1.Albums ON DELETE CASCADE; CREATE VIEW sch1.SingerView SQL SECURITY INVOKER AS Select s.FirstName, s.LastName, s.SingerInfo FROM sch1.Singers AS s WHERE s.SingerId = 123456; CREATE VIEW SingerView SQL SECURITY INVOKER AS Select s.FirstName, s.LastName, s.SingerInfo FROM Singers AS s WHERE s.SingerId = 123456;
Spanner 只允许您创建与使用相应索引的表具有相同架构的索引。我们需要确保索引和表架构名称相同。
PostgreSQL
运行
CREATE SCHEMA
语句以创建命名架构,例如:CREATE SCHEMA sch1;
在命名架构中添加数据库对象,例如:
CREATE SEQUENCE sch1.sequence BIT_REVERSED_POSITIVE CREATE TABLE sch1.singers( singer_id bigint primary key, album_id bigint default(nextval('sch1.sequence'))) CREATE TABLE sch1.albums(k bigint default(nextval('sch1.sequence'))primary key, album_id bigint) CREATE VIEW sch1.singer_view SQL SECURITY INVOKER AS SELECT * FROM sch1.singers CREATE INDEX index_singers ON TABLE sch1.singers(album_id)
Spanner 只允许在同一架构中创建索引。在 Spanner 中,PostgreSQL 语句默认会执行此操作。您无需使用完全限定名称即可在命名架构上创建索引。
在探索器窗格中查看命名架构和相关对象。
添加对命名架构的精细访问权限控制
以下 DDL 语句会添加对命名架构的精细访问权限控制:
USAGE
权限可授予对架构对象的权限。默认情况下,系统会授予对默认架构的USAGE
权限。不过,您可以撤销对默认架构的USAGE
权限。撤销访问权限时请务必谨慎,因为被撤销的用户和角色将失去对默认架构中所有对象的访问权限。ALL
语句可对架构中某种类型的所有对象执行批量授权操作。DEFAULT
关键字在 FGAC DDL 语句中引用默认架构。
如需访问某个命名架构中的对象,您必须拥有对该命名架构的使用权限,以及对使用该架构的数据库对象的相应权限。例如,以下语句会授予从表中读取数据的权限:
GRANT SELECT ON TABLE TABLE_NAME IN SCHEMA TO ROLE ROLE_NAME
(GoogleSQL 和 PostgreSQL)向角色授予从架构中的特定表读取数据的权限。或者,您也可以使用ALL
关键字向角色授予从架构中的所有表读取数据的权限。例如GRANT SELECT ON ALL TABLES IN SCHEMA TO ROLE ROLE_NAME
。上述ALL
语句仅适用于执行该语句时存在的表。GRANT USAGE ON SCHEMA SCHEMA_NAME TO ROLE ROLE_NAME
(GoogleSQL 和 PostgreSQL)向角色授予访问架构中所含对象的权限,前提是所含对象的权限也得到满足。例如,对于架构中的表,您需要对相应架构拥有“USAGE”权限,并对相应表拥有“SELECT”权限,才能从相应表中读取数据。
在 Google Cloud 控制台中,打开 Spanner 页面。
从列表中选择一个实例。
选择数据库。
在导航菜单中,点击 Spanner Studio。
点击
新的 SQL 编辑器标签页或 新标签页以打开新标签页。在编辑器标签页中,输入 DDL。
GoogleSQL
为命名架构创建自定义角色。在以下示例中,我们使用
role1
和role2
。CREATE ROLE role1 CREATE ROLE role2
使用
GRANT ALL
授予针对使用命名架构的表的角色。在以下示例中,我们将sch1
用于命名架构,将role1
用于角色。GRANT SELECT ON ALL TABLES IN SCHEMA sch1 TO ROLE role1
为您创建的角色授予对架构的使用权限。在以下示例中,我们向
role1
和role2
授予对sch1
的使用权限。GRANT USAGE ON SCHEMA sch1 TO ROLE role1, role2
PostgreSQL
为命名架构创建自定义角色。在以下示例中,我们使用
role1
和role2
。CREATE ROLE role1 CREATE ROLE role2
使用
GRANT ALL
授予针对使用命名架构的表的角色。在以下示例中,我们将sch1
用于命名架构,将role1
用于角色。GRANT SELECT ON ALL TABLES IN SCHEMA sch1 TO role1
为您创建的角色授予对架构的使用权限。在以下示例中,我们向
role1
和role2
授予对sch1
的使用权限。GRANT USAGE ON SCHEMA sch1 TO role1, role2
添加和撤销对默认架构的精细访问权限控制
如果您具有命名架构,则默认架构名为 default
。在添加或撤销精细访问权限控制时,您需要使用 default
架构名称。
添加对默认架构的精细访问权限控制
默认情况下,所有用户和角色都对默认架构拥有 USAGE
权限。
在 Google Cloud 控制台中,打开 Spanner 页面。
从列表中选择一个实例。
选择数据库。
在导航菜单中,点击 Spanner Studio。
点击
新的 SQL 编辑器标签页或 新标签页以打开新标签页。在编辑器标签页中,输入 DDL。
GoogleSQL
在以下示例中,我们向
role1
授予对所有表的访问权限。GRANT SELECT ON ALL TABLES IN SCHEMA default TO ROLE role1
PostgreSQL
在以下示例中,我们向
role1
授予对所有表的访问权限。GRANT SELECT ON ALL TABLES IN SCHEMA default TO role1
撤销对默认架构的精细访问权限控制
您可以使用 REVOKE USAGE
命令撤销对默认架构的默认精细访问权限控制权限。
在 Google Cloud 控制台中,打开 Spanner 页面。
从列表中选择一个实例。
选择数据库。
在导航菜单中,点击 Spanner Studio。
点击
新的 SQL 编辑器标签页或 新标签页以打开新标签页。在编辑器标签页中,输入 DDL。
GoogleSQL
REVOKE USAGE ON SCHEMA DEFAULT FROM ROLE public
PostgreSQL
REVOKE USAGE ON SCHEMA public FROM public
运行以上命令后,我们必须明确向需要访问默认架构的角色授予权限。在以下示例中,我们向
role1
授予权限。GoogleSQL
在以下示例中,我们向
role1
授予对默认架构的访问权限。GRANT USAGE ON SCHEMA default to ROLE role1
PostgreSQL
在以下示例中,我们向
role1
授予对默认架构的访问权限。GRANT USAGE ON SCHEMA public To role1
查看命名架构
- 从列表中选择一个实例。
- 选择数据库。
- 在导航菜单中,点击 Spanner Studio。
在探索器窗格中,展开“架构”下拉列表。
或者,您也可以使用 SQL 在 information_schema.schemata
表中查看所有架构。
以下示例展示了如何查看命名架构及其所有者:
SELECT schema_name, schema_owner
FROM information_schema.schemata
ORDER BY schema_owner
此语句会提供架构和所有者的列表,类似于以下内容:
public spanner_admin
products spanner_admin
analytics spanner_admin
logs spanner_admin
pg_catalog spanner_system
information_schema spanner_system
spanner_sys spanner_system
删除命名架构
DROP SCHEMA
命令(GoogleSQL 和 PostgreSQL)用于删除命名架构。
在 Google Cloud 控制台中,打开 Spanner 页面。
从列表中选择一个实例。
选择数据库。
在导航菜单中,点击 Spanner Studio。
点击
新的 SQL 编辑器标签页或 新标签页以打开新标签页。在编辑器标签页中,输入 DDL。
GoogleSQL
在以下示例中,我们删除了
sch1
。DROP SCHEMA IF EXISTS sch1;
PostgreSQL
在以下示例中,我们删除了
sch1
。DROP SCHEMA IF EXISTS sch1;