4. Unity Catalog 权限体系:Databricks 的权限模型、Securable Object 层级与 Privilege 类型

好,咱们进入 Unity Catalog 的权限核心。说白了,你要管好 Lakehouse 的数据,就得先搞懂 Databricks 是怎么定义“谁能在什么东西上干什么”的。这套体系,我称之为“三板斧”:权限模型、可保护对象层级、以及权限类型。一个一个来。

4.1 权限模型:从“扁平”到“三层”的进化

我记得最早用 Databricks 的时候,权限管理其实挺原始的。基本就是 workspace 级别的,要么是管理员,要么是普通用户,细粒度控制?不存在的。后来有了 Hive Metastore 的 ACL,但那东西性能差,而且跟 Spark 的集成很别扭。

Unity Catalog 彻底改了这套玩法。它引入了一个 三层命名空间 的权限模型:Catalog → Schema → 表/视图/函数。你想想看,这就像你公司里的组织架构:Catalog 是事业部,Schema 是部门,表就是具体的员工工位。权限可以在这三个层级上分别设置,而且下层默认继承上层的权限。

核心变化: 从“谁能在集群上跑代码”变成了“谁能在 Catalog 里看到什么数据”。权限跟计算资源解耦了,这才是 Lakehouse 该有的样子。

4.2 Securable Object 层级:一棵清晰的树

Unity Catalog 里所有能被授权的东西,都叫 Securable Object。它们天然形成一个层级结构。我习惯画一张图来理解它,你看下面这个 SVG:

Unity Catalog Securable Object 层级结构图 Unity Catalog Securable Object 层级 Metastore (根) Catalog Schema 表 / 视图 函数 ML 模型 关键规则 1. 权限默认向下继承:给 Catalog 授权,其下所有 Schema 和表都生效。 2. 下层可以覆盖上层:在表级别单独授权,会覆盖从 Schema 继承的权限。 3. 拒绝优先:如果用户被显式拒绝,无论上层给什么权限都无效。

嗯,这里要注意:Metastore 是根节点,但你一般不会直接给用户赋权到 Metastore 级别,那权限太大了。实际工作中,我们通常从 Catalog 开始授权。

4.3 Privilege 类型:你能干什么?

搞清楚了对象层级,接下来就是“能干什么”。Unity Catalog 的权限(Privilege)设计得很精细,我把它分成三大类:

类别 权限名称 作用说明 我常用的场景
元数据浏览 USAGE 允许查看对象存在,但不能读数据 给数据目录团队,让他们能看到有哪些表,但看不到数据
数据读取 SELECT 允许读取表/视图中的数据 给数据分析师,让他们能查表
数据写入 MODIFY 允许插入、更新、删除数据 给 ETL 作业,让它们能写数据
对象管理 CREATE 允许在 Schema 下创建表/视图 给数据工程师,让他们能建新表
对象管理 ALTER 允许修改对象定义(如加列、改注释) 给数据建模人员,让他们能调整表结构
对象管理 DROP 允许删除对象 谨慎使用,我一般只给管理员
权限管理 OWNERSHIP 对象所有者,拥有全部权限,且能授权给他人 创建对象的人自动获得,或者手动转移

我的一个小习惯: 给普通用户只授 USAGE + SELECT。千万别手滑给了 MODIFY,否则数据被误删了,你哭都来不及。我曾经在一个项目里,就因为图省事给了一个分析师 MODIFY 权限,结果他写 SQL 时忘了加 WHERE 条件,把整个表更新了……嗯,从那以后我都是按最小权限原则来。

4.4 实际操作:用 SQL 来赋权

理论说完了,咱们看看怎么用。Unity Catalog 支持用标准 SQL 来管理权限,这比点鼠标靠谱多了,方便自动化。

比如,我要给用户 alice@company.com 授予对 sales_db Catalog 下所有表的读取权限:

-- 第一步:先给 USAGE,让她能看到 Catalog 和 Schema
GRANT USAGE ON CATALOG sales_db TO `alice@company.com`;
GRANT USAGE ON SCHEMA sales_db.analytics TO `alice@company.com`;

-- 第二步:再给 SELECT,让她能读数据
GRANT SELECT ON ALL TABLES IN SCHEMA sales_db.analytics TO `alice@company.com`;

-- 未来新表自动继承:设置默认权限
ALTER SCHEMA sales_db.analytics SET DEFAULT PRIVILEGES
  FOR ALL USERS
  GRANT SELECT ON TABLES TO `alice@company.com`;

你看,三步走。先给 USAGE 让她能“看见”,再给 SELECT 让她能“读取”。最后那个 SET DEFAULT PRIVILEGES 是个好东西,以后在这个 Schema 下新建的表,会自动给 alice 加上 SELECT 权限,省得你每次都手动跑一遍。

避坑指南: 我曾经犯过一个错——只给了 SELECT,忘了给 USAGE。结果 alice 跑来跟我说“我查不到任何表”。我排查了半天,才发现她连 Catalog 都看不见。记住:USAGE 是“门票”,没有它,后面的权限都是白搭。

4.5 权限的继承与覆盖:一个容易搞混的点

层级权限最让人头疼的就是继承关系。我总结一个口诀:上层授权,下层生效;下层授权,覆盖上层。

举个例子:

  • 你在 Catalog 级别给了 SELECT,那么该 Catalog 下所有 Schema 和表,用户都能读。
  • 但是,如果你在某个表级别又给了 MODIFY,那用户在这个表上就能写数据了——这是“增加”权限。
  • 如果你想“缩小”权限,比如某个表不想让用户读,你可以在表级别 REVOKE SELECT,或者用 DENY(如果支持的话)。

嗯,这里要特别提一下 DENY。Unity Catalog 支持显式的拒绝权限。它的优先级最高。哪怕你在 Catalog 级别给了 SELECT,只要在表级别 DENY SELECT,用户就读不了那个表。这在我们做“数据脱敏”或者“合规隔离”时特别有用。

-- 给所有人 SELECT 权限
GRANT SELECT ON CATALOG sales_db TO `account users`;

-- 但拒绝某个敏感表
DENY SELECT ON TABLE sales_db.analytics.credit_card_info TO `account users`;

这样,普通用户能看到 sales_db 下大部分表,但就是查不了信用卡信息表。干净利落。

4.6 总结一下

Unity Catalog 的权限体系,说白了就是:三层对象(Catalog-Schema-Table),一套权限(USAGE/SELECT/MODIFY/CREATE/...),加上继承和覆盖规则。 你只要记住“最小权限”和“USAGE 是门票”这两条,基本不会出大错。

我个人觉得,这套设计比传统的 Hive ACL 或者 Ranger 要清晰得多。它跟 SQL 标准结合得很好,学习成本低。你只要会写 GRANT 语句,就能搞定大部分场景。