第 15 章 · 权限、配额与多租户 — 可视化演示

三个交互演示:① User / Role / Profile / Quota 关系图 · ② 行级 / 列级权限示意 · ③ 配额触发动画

五件套:User · Role · Profile · Quota · Row Policy

点击任一卡片看详细 SQL 与作用:

👤
User
alice / bob / tenant_acme
身份认证
↓ DEFAULT ROLE / GRANT role TO user
🎭
Role
analytics_reader
data_engineer
saas_tenant
↓ GRANT 权限 TO role / ALTER ROLE SETTINGS PROFILE
🛡️
Settings Profile
readonly = 1
max_memory_usage
max_execution_time
⏱️
Quota
每小时 1000 次
累计扫描 1 亿行
累计 1800 秒
🚧
Row Policy
USING tenant_id
= currentUser()
↓ 共同保护 ↓
🗄️
events 表
几亿行业务数据 · 多租户共用

👆 点上方任一卡片查看详细 SQL

每一层都管一件事,叠加才安全。

切换不同身份,看到的数据如何变化

下面是一张多租户表 events。点不同身份按钮,体验「行级 + 列级」权限的双重过滤:

当前身份:admin · GRANT SELECT ON events 全部
event_time tenant_id user_id event_type properties
关键点: 行级(RLS)通过 CREATE ROW POLICY ... USING tenant_id = currentUser() 实现; 列级通过 GRANT SELECT(col1, col2) ON db.t 实现。 两者可叠加,构成「我只能看到我自己租户的非敏感字段」的精细控制。

配额(Quota)超限拒绝演示

配额给 tenant_acme 的限制是:每小时 ≤ 100 次查询、累计扫描 ≤ 1000 万行、累计 ≤ 60 秒执行时间:

queries 次数 0 / 100
0 / 100
read_rows 累计扫描行数 0 / 10,000,000
0 / 10M
execution_time 累计执行时间 0.0 / 60.0 秒
0 / 60s
errors 失败次数 0 / 50
0 / 50
触发后果: 任一维度突破时,CK 直接报 Code: 201. Quota for user has been exceeded, 后续查询全部拒绝,直到时间窗口 reset。