本页介绍了您可以向数据库角色授予哪些特权,以实现精细的访问权限控制。
如需了解数据库角色和精细的访问权限控制,请参阅 精细访问权限控制简介。
下表显示了精细的访问权限控制权限和数据库对象 权限。
选择 | 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
与序列搭配使用时,您只能查看自己有权查看的序列。
示例
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
”。
示例
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
。
示例
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
”。该角色还需要
SELECT
对任何可能 包含在查询的WHERE
子句中。对于 GoogleSQL 方言数据库中的交错表,只有父表需要
DELETE
权限。如果子表 指定ON DELETE CASCADE
时,即使子表中的行 子表的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
权限:
读取函数。如需了解详情,请参阅
更改数据流读取函数和查询语法。
将此选项与模型结合使用时,将允许角色在 机器学习功能。
示例
以下示例展示了如何为名为 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 方言数据库)