本页面介绍如何创建、使用和删除命名架构,以及如何对命名架构中的对象应用精细访问权限控制。如需大致了解命名架构,请参阅命名架构。
准备工作
如需执行本页面上的过程,您需要满足以下前提条件:
- 您的用户账号具有 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;