本页面介绍了您可以向数据库角色授予哪些权限,以实现精细的访问权限控制。此信息适用于 GoogleSQL 方言数据库和 PostgreSQL 方言数据库。
如需了解数据库角色和精细访问权限控制,请参阅精细访问权限控制概览。
下表列出了精细访问权限控制权限,以及可以授予这些权限的数据库对象。
选择 | INSERT | 更新 | 删除 | 执行 | 用法 | |
---|---|---|---|---|---|---|
架构 | ✓ | |||||
表格 | ✓ | ✓ | ✓ | ✓ | ||
列 | ✓ | ✓ | ✓ | ✓ | ||
视图 | ✓ | |||||
变更数据流 | ✓ | |||||
变更数据流读取函数 | ✓ | |||||
序列 | ✓ | ✓ | ||||
模型 | ✓ |
以下各部分详细介绍了每项权限。
SELECT
允许角色从表、视图、变更数据流、序列或模型中读取或查询数据。
如果为表指定了列列表,则该权限仅对这些列有效。如果未指定列列表,则该权限对表中的所有列(包括之后添加的列)均有效。不允许为视图使用列列表。
Spanner 同时支持调用方权限视图和定义者权限视图。如需了解详情,请参阅视图概览。
如果您使用调用方权限创建视图,则数据库角色或用户需要对视图拥有
SELECT
权限,并对视图中引用的底层对象拥有SELECT
权限,才能查询该视图。例如,假设在Singers
表上创建了视图SingerNames
。CREATE VIEW SingerNames SQL SECURITY INVOKER AS SELECT Singers.SingerId, Singers.FirstName, Singers.LastName FROM Singers;
假设数据库角色
myRole
执行查询SELECT * FROM SingerNames
。该角色必须对该视图拥有SELECT
权限,并且必须对三个引用的列或整个Singers
表拥有SELECT
权限。如果您使用定义者权限创建视图,那么数据库角色或用户只需要对视图具有
SELECT
权限,即可查询该视图。例如,假设在Albums
表上创建了视图AlbumsBudget
。CREATE VIEW AlbumsBudget SQL SECURITY DEFINER AS SELECT Albums.Id, Albums.AlbumTitle, MarketingBudget FROM Albums;
假设数据库角色
Analyst
执行查询SELECT * FROM AlbumsBudget
。该角色只需要对该视图具有SELECT
权限。它不需要对这三个引用的列或Albums
表具有SELECT
权限。授予对表的列子集的
SELECT
权限后,FGAC 用户将无法再对该表使用SELECT *
。对该表的查询必须为要包含的所有列命名。对生成的列授予的
SELECT
权限不会授予对底层基本列的SELECT
权限。对于交织表,在父表上授予的
SELECT
权限不会传播到子表。在对变更数据流授予
SELECT
权限时,您还必须对变更数据流的表值函数授予EXECUTE
权限。如需了解详情,请参阅执行。当
SELECT
与特定列上的聚合函数(例如SUM(col_a)
)结合使用时,该角色必须对这些列具有SELECT
权限。如果聚合函数未指定任何列(例如COUNT(*)
),则该角色必须对表中的至少一列拥有SELECT
权限。将
SELECT
与序列搭配使用时,您只能查看自己有权查看的序列。
使用 GRANT SELECT
的示例
GoogleSQL
GRANT SELECT ON TABLE employees TO ROLE hr_director; GRANT SELECT ON TABLE customers, orders, items TO ROLE account_mgr; GRANT SELECT(name, level, cost_center, location, manager) ON TABLE employees TO ROLE hr_manager; GRANT SELECT(name, address, phone) ON TABLE employees, contractors TO ROLE hr_rep; GRANT SELECT ON VIEW orders_view TO ROLE hr_manager; GRANT SELECT ON CHANGE STREAM ordersChangeStream TO ROLE hr_analyst; GRANT SELECT ON SEQUENCE sequence_name TO ROLE role_name;
PostgreSQL
GRANT SELECT ON TABLE employees TO hr_director; GRANT SELECT ON TABLE customers, orders, items TO account_mgr; GRANT SELECT(name, level, cost_center, location, manager) ON TABLE employees TO hr_manager; GRANT SELECT(name, address, phone) ON TABLE employees, contractors TO hr_rep; GRANT SELECT ON TABLE orders_view TO hr_manager; // orders_view is an invoker rights view GRANT SELECT ON CHANGE STREAM orders_change_stream TO hr_analyst; GRANT SELECT ON SEQUENCE sequence_name TO hr_package;
INSERT
允许该角色向指定表中插入行。如果指定了列列表,则权限仅对这些列有效。如果未指定列列表,则该权限对表中的所有列均有效。
如果指定了列名称,则在插入时,未包含的任何列都会获取其默认值。
无法授予对生成的列的
INSERT
权限。
使用 GRANT INSERT
的示例
GoogleSQL
GRANT INSERT ON TABLE employees, contractors TO ROLE hr_manager; GRANT INSERT(name, address, phone) ON TABLE employees TO ROLE hr_rep;
PostgreSQL
GRANT INSERT ON TABLE employees, contractors TO hr_manager; GRANT INSERT(name, address, phone) ON TABLE employees TO hr_rep;
UPDATE
允许该角色更新指定表中的行。更新可以仅限于部分表列。将此权限与序列搭配使用时,该角色可以对序列调用 get-next-sequence-value
函数。
除了 UPDATE
权限之外,该角色还需要对所有查询列拥有 SELECT
权限。查询的列包括 WHERE
子句中的列。
无法授予对生成的列的 UPDATE
权限。
使用 GRANT UPDATE
的示例
GoogleSQL
GRANT UPDATE ON TABLE employees, contractors TO ROLE hr_manager; GRANT UPDATE(name, address, phone) ON TABLE employees TO ROLE hr_rep;
PostgreSQL
GRANT UPDATE ON TABLE employees, contractors TO hr_manager; GRANT UPDATE(name, address, phone) ON TABLE employees TO hr_rep;
DELETE
允许该角色从指定表中删除行。
无法在列级别授予
DELETE
权限。该角色还需要对查询的
WHERE
子句中可能包含的任何列拥有SELECT
权限。对于 GoogleSQL 方言数据库中的交织表,只有父表需要
DELETE
权限。如果子表指定了ON DELETE CASCADE
,即使没有子表的DELETE
权限,系统也会删除子表中的行。
使用 GRANT DELETE
的示例
GoogleSQL
GRANT DELETE ON TABLE employees, contractors TO ROLE hr_admin;
PostgreSQL
GRANT DELETE ON TABLE employees, contractors TO hr_admin;
EXECUTE
在授予对变更数据流的 SELECT
权限时,您还必须授予对变更数据流的读取函数的 EXECUTE
权限。如需了解详情,请参阅变更数据流读取函数和查询语法。
将此权限与模型搭配使用时,该角色可在机器学习函数中使用模型。
使用 GRANT EXECUTE
的示例
以下示例展示了如何针对名为 my_change_stream
的变更数据流的读取函数授予 EXECUTE
权限。
GoogleSQL
GRANT EXECUTE ON TABLE FUNCTION READ_my_change_stream TO ROLE hr_analyst;
PostgreSQL
GRANT EXECUTE ON FUNCTION spanner.read_json_my_change_stream TO hr_analyst;
用法
在您授予对命名架构的 USAGE
权限后,相应角色有权访问命名架构中包含的对象。默认情况下,系统已向相应角色授予对默认架构的 USAGE
权限。
后续步骤
- 配置精细访问权限控制
- 精细访问权限控制概览
- GRANT 和 REVOKE 语句(GoogleSQL 方言数据库)
- GRANT 和 REVOKE 语句(PostgreSQL 方言数据库)