精细的访问权限控制权限

本页面介绍了您可授予数据库角色以实现精细访问权限控制的权限。

如需了解数据库角色和精细访问权限控制,请参阅关于精细访问权限控制

下表显示了精细的访问权限控制权限以及可以授予这些权限的数据库对象。

SELECT INSERT UPDATE 删除 执行
查看
变更数据流
更改数据流读取函数
序列
模型

以下部分详细介绍了每项权限。

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 权限。

  • 此外,此角色还需要对所有键列以及查询 WHERE 子句中可能包含的任何列拥有 SELECT 权限。

  • 对于 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;

后续步骤

如需了解详情,请参阅以下主题: