📣
TiDB Cloud Premium 开放公测中。为企业级工作负载提供无限扩展、即时弹性伸缩和高级安全保障。此页面由 AI 自动翻译,英文原文请见此处。

所有权



所有权是一种特殊的权限,表示某个角色在 TiDB Cloud Lake 中对特定数据对象(当前包括数据库、表、UDF 和 stage)所拥有的专属权利和责任。

授予所有权

对象的所有权会自动授予创建该对象的用户所属角色,并且可以使用 GRANT 命令在角色之间转移:

  • 将对象的所有权授予新角色时,会把完整所有权转移给新角色,并从原角色中移除该所有权。例如,如果角色 A 最初拥有某个表,而你将所有权授予角色 B,则角色 B 会成为新的所有者,角色 A 将不再拥有该表的所有权。
  • 出于安全原因,不建议将所有权授予内置角色 public。如果用户在创建对象时属于 public 角色,那么所有用户都将拥有该对象的所有权,因为每个用户默认都具有 public 角色。TiDB Cloud Lake 建议创建并为用户分配自定义角色,而不是使用 public 角色,以便更清晰地管理所有权。有关内置角色的信息,请参见内置角色。
  • default 数据库中的表不能授予所有权,因为它由内置角色 account_admin 拥有。

不允许撤销所有权

不支持撤销所有权,因为每个对象都必须有一个所有者。

  • 如果对象被删除,它不会保留原角色的所有权。如果该对象被恢复(如果可能),所有权也不会自动重新分配,此时需要由 account_admin 手动将所有权重新分配给某个角色。
  • 如果拥有某个对象的角色被删除,account_admin 可以将该对象的所有权转移给另一个角色。

示例

要将所有权授予某个角色,请使用 GRANT 命令。以下示例演示了如何将不同数据库对象的所有权授予角色 'data_owner':

-- Grant ownership of all tables in the 'finance_data' database to the role 'data_owner' GRANT OWNERSHIP ON finance_data.* TO ROLE 'data_owner'; -- Grant ownership of the table 'transactions' in the 'finance_data' schema to the role 'data_owner' GRANT OWNERSHIP ON finance_data.transactions TO ROLE 'data_owner'; -- Grant ownership of the stage 'ingestion_stage' to the role 'data_owner' GRANT OWNERSHIP ON STAGE ingestion_stage TO ROLE 'data_owner'; -- Grant ownership of the user-defined function 'calculate_profit' to the role 'data_owner' GRANT OWNERSHIP ON UDF calculate_profit TO ROLE 'data_owner';

以下示例演示了如何在 TiDB Cloud Lake 中建立基于角色的所有权。管理员创建角色 'role1' 并将其分配给用户 'u1'。随后,将在 'db' schema 中创建表的权限授予 'role1'。因此,当 'u1' 登录后,他们将拥有 'role1' 的权限,从而可以在 'db' 下创建并拥有表。但是,对不属于 'role1' 所有的表的访问会受到限制,这一点可以从对 'db.t_old_exists' 的查询失败中看出。

-- Admin creates roles and assigns roles to corresponding users CREATE ROLE role1; CREATE USER u1 IDENTIFIED BY '123' WITH DEFAULT ROLE 'role1'; GRANT CREATE ON db.* TO ROLE role1; GRANT ROLE role1 TO u1; -- After u1 logs into TiDB Cloud Lake, role1 has been granted to u1, so u1 can create and own tables under db: u1> CREATE TABLE db.t(id INT); u1> INSERT INTO db.t VALUES(1); u1> SELECT * FROM db.t; u1> SELECT * FROM db.t_old_exists; -- Failed because the owner of this table is not role1

以下示例展示了如何让用户创建仅由其角色拥有的数据库,这样其他用户除非被显式授予访问权限,否则无法看到这些数据库:

CREATE ROLE part1_role; GRANT CREATE DATABASE ON *.* TO ROLE part1_role; CREATE USER user1 IDENTIFIED BY 'abc123' WITH DEFAULT ROLE 'part1_role'; GRANT ROLE part1_role TO user1; -- When user1 creates a database, ownership is assigned to part1_role. -- Other users will not be able to see or access that database unless -- privileges or ownership are granted to their roles.

文档内容是否有帮助?