1. 全局平台用户(在 accounts.yunqi.com 注册)
↓ 自动同步
2. 实例用户池(存在于 Lakehouse 实例中)
↓ CREATE USER 命令
3. 工作空间用户(被授权访问特定工作空间)
↓ GRANT ROLE 命令
4. 拥有角色的用户(具有实际操作权限)
重要概念:在工作空间中执行
CREATE USER
CREATE USER
实际上是将已存在于实例用户池的用户添加到当前工作空间,这就是为什么不需要指定密码的原因。
2.4 角色权限范围说明
⚠️ 注意:> - 不同角色之间的权限继承关系需要根据实际环境验证,不同版本可能有所差异
system_admin
system_admin
角色即将下线,建议使用
instance_admin
instance_admin
作为实例级管理角色
建议通过实际测试确认各角色的具体权限范围
三、 关键概念:两种盘点视角(必读)
3.1 空间级盘点 vs 实例级盘点
对比维度
📁 空间级盘点
🌐 实例级盘点
数据来源
information_schema(已过滤)
全局元数据(需特殊权限)
SQL 过滤条件
WHERE workspace_id = current_workspace_id()
WHERE workspace_id = current_workspace_id()
无过滤,可见所有数据
可见范围
仅当前工作空间
所有工作空间
适用场景
日常权限管理
全局安全审计
局限性
❌ 无法看到其他工作空间 ❌ 可能误判权限冗余
❌ 需要高级权限 ❌ 操作复杂度高
3.2 重要提示
⚠️ 关键区别:
使用
information_schema
information_schema
进行的盘点都是空间级盘点,只能看到当前工作空间的"局部视图"
要进行实例级盘点,需要通过 Studio 管理控制台或特殊权限访问全局数据
判断方法:如果你的查询基于
information_schema
information_schema
表,那么你正在进行空间级盘点
五、权限盘点实践步骤
步骤 1:明确盘点级别
-- 确认当前盘点环境和级别
SELECT
'当前盘点级别' as check_item,
'空间级盘点' as level,
current_workspace() as workspace_scope,
'仅可见当前工作空间数据' as visibility_limit,
'如需全局视图请使用管理控制台' as suggestion;
步骤 2:用户角色分布分析
-- 分析用户的角色分配情况(已脱敏)
SELECT
CASE
WHEN user_name LIKE 'admin%' THEN 'admin_user_' || ROW_NUMBER() OVER (ORDER BY user_name)
WHEN user_name LIKE 'dev%' THEN 'dev_user_' || ROW_NUMBER() OVER (ORDER BY user_name)
ELSE 'user_' || ROW_NUMBER() OVER (ORDER BY user_name)
END as masked_user,
role_names,
LENGTH(role_names) - LENGTH(REPLACE(role_names, ',', '')) + 1 as role_count,
CASE
WHEN role_names LIKE '%system_admin%' THEN '包含实例级角色'
WHEN role_names LIKE '%workspace_admin%' THEN '空间管理员'
WHEN role_names LIKE '%workspace_dev%' THEN '开发人员'
ELSE '普通用户'
END as user_category
FROM information_schema.users
ORDER BY role_count DESC;
步骤 3:角色使用情况分析
-- 分析角色的分配和使用情况
SELECT
role_name,
CASE
WHEN role_name LIKE 'instance_%' THEN '实例级角色(在空间级视图中)'
WHEN role_name = 'system_admin' THEN '实例级角色(即将下线)'
WHEN role_name LIKE 'workspace_%' THEN '空间级-系统预置'
ELSE '空间级-自定义'
END as role_classification,
CASE
WHEN user_names IS NULL OR user_names = '' THEN '⚠️ 未分配'
ELSE '✅ 已分配'
END as assignment_status,
CASE
WHEN user_names IS NOT NULL THEN
LENGTH(user_names) - LENGTH(REPLACE(user_names, ',', '')) + 1
ELSE 0
END as assigned_user_count,
comment as description
FROM information_schema.roles
ORDER BY
CASE WHEN user_names IS NULL THEN 0 ELSE 1 END DESC,
role_name;
⚠️ 注意:虽然
instance_admin
instance_admin
等是实例级角色,但它们也会出现在空间级的
information_schema.roles
information_schema.roles
视图中,这是因为这些角色在当前工作空间中有用户被授予了该角色。
步骤 4:权限冗余检测
-- 检测潜在的权限冗余(需验证角色间是否真的存在继承关系)
WITH permission_check AS (
SELECT
CASE
WHEN user_name LIKE 'admin%' THEN 'admin_user'
WHEN user_name LIKE 'dev%' THEN 'dev_user'
ELSE 'regular_user'
END as user_type,
role_names,
CASE
WHEN role_names LIKE '%system_admin%'
AND role_names LIKE '%workspace_%'
THEN '可能存在跨级别冗余(需验证)'
WHEN role_names LIKE '%workspace_admin%'
AND role_names LIKE '%workspace_user%'
THEN '可能存在同级别冗余(需验证)'
ELSE '表面无冗余'
END as redundancy_check,
'建议:实际测试各角色权限以确认是否真的冗余' as action_needed
FROM information_schema.users
)
SELECT * FROM permission_check
WHERE redundancy_check != '表面无冗余';
步骤 5:生成盘点报告
-- 生成空间级权限盘点摘要
WITH summary AS (
SELECT
COUNT(DISTINCT user_name) as total_users,
COUNT(DISTINCT role_name) as total_roles,
SUM(CASE WHEN user_names IS NOT NULL THEN 1 ELSE 0 END) as assigned_roles,
SUM(CASE WHEN user_names IS NULL THEN 1 ELSE 0 END) as unassigned_roles
FROM information_schema.users
CROSS JOIN information_schema.roles
)
SELECT
'===== 空间级权限盘点报告 =====' as report_header,
current_workspace() as workspace_name,
total_users || ' 个用户' as user_summary,
total_roles || ' 个角色(' || assigned_roles || ' 已分配,' || unassigned_roles || ' 未分配)' as role_summary,
ROUND(assigned_roles * 100.0 / total_roles, 1) || '%' as role_utilization,
'注意:本报告仅包含当前工作空间数据' as important_notice
FROM summary;
-- 创建空间级权限监控视图
CREATE VIEW workspace_permission_monitor AS
SELECT
current_date() as monitor_date,
current_workspace() as workspace,
'空间级监控' as monitor_level,
COUNT(DISTINCT u.user_name) as user_count,
COUNT(DISTINCT r.role_name) as role_count,
SUM(CASE WHEN r.user_names IS NOT NULL THEN 1 ELSE 0 END) as active_roles,
ROUND(
SUM(CASE WHEN r.user_names IS NOT NULL THEN 1 ELSE 0 END) * 100.0 /
COUNT(DISTINCT r.role_name),
1
) as role_usage_percentage,
COUNT(DISTINCT CASE WHEN u.role_names LIKE '%system_admin%' THEN u.user_name END) as admin_users
FROM information_schema.users u
CROSS JOIN information_schema.roles r
GROUP BY workspace;
7.2 定期检查脚本
-- 每月执行的权限健康检查
WITH health_check AS (
-- 检查1: 未使用的角色
SELECT
'unused_roles' as check_type,
COUNT(*) as issue_count,
'存在未分配的角色' as description
FROM information_schema.roles
WHERE user_names IS NULL OR user_names = ''
UNION ALL
-- 检查2: 可能的权限冗余
SELECT
'potential_redundancy' as check_type,
COUNT(*) as issue_count,
'用户可能存在角色冗余' as description
FROM information_schema.users
WHERE LENGTH(role_names) - LENGTH(REPLACE(role_names, ',', '')) + 1 > 2
UNION ALL
-- 检查3: 高权限用户
SELECT
'high_privilege_users' as check_type,
COUNT(*) as issue_count,
'拥有admin权限的用户' as description
FROM information_schema.users
WHERE role_names LIKE '%admin%'
)
SELECT
check_type,
issue_count,
description,
CASE
WHEN issue_count > 0 THEN '需要关注'
ELSE '正常'
END as status
FROM health_check
ORDER BY issue_count DESC;