精细的访问权限控制权限

本页面介绍您可为以下项目的数据库角色授予的权限: 精细的访问权限控制

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

下表显示了精细的访问权限控制权限和数据库对象 权限。

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 权限 并且必须拥有 SELECT 三个引用的列或 整个 Singers 表。

    如果您创建了一个具有定义者权限的视图,那么要查询该视图,数据库 角色或用户只需要拥有数据视图的 SELECT 权限。例如: 假设在 Albums 表上创建了视图 AlbumsBudget

    CREATE VIEW AlbumsBudget SQL SECURITY DEFINER AS
      SELECT Albums.Id, Albums.AlbumTitle, MarketingBudget FROM Albums;
    

    假设数据库角色 Analyst 执行查询 SELECT * FROM AlbumsBudget.此角色只需要对以下角色拥有 SELECT 权限: 视图。它不需要对三个引用的列拥有 SELECT 权限 或在 Albums 表中添加。

  • 针对表的部分列授予 SELECT 权限后,FGAC 用户可以 不再对该表使用 SELECT *。针对该表的查询必须将所有 要包含的列。

  • 对生成的列授予 SELECT 权限时,未授予底层的 SELECT 权限 基列。

  • 对于交错表,对父表授予的 SELECT 不会 传播到子表。

  • 如果您向变更数据流授予 SELECT,则还必须向以下对象授予 EXECUTE: 变更数据流的表值函数。如需了解详情,请参阅 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 权限: read 函数。如需了解详情,请参阅 更改数据流读取函数和查询语法

将此选项与模型结合使用时,将允许角色在 机器学习功能

示例

以下示例显示如何向 EXECUTE 授予 名为“my_change_stream”的变更数据流。

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 权限的授予者: 默认为默认架构。

后续步骤

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