
GaussDB 从非三权分立切到三权分立后系统管理员会同时失去 CREATEROLE 和 AUDITADMIN也不再默认能访问其他用户模式下的表、视图、函数。这个变化要对照表2逐项裁剪我选择让 Codex 走 TaoTokenhttps://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 来核对权限变化因为它提供统一接入不用在多个厂商配置之间来回切。先去官网拿 Key再在 Codex 的 config.toml 里把 Base URL 指到 https://taotoken.net/api就能让 Codex 帮你按角色清单输出裁剪点。这次排查的起点不是 Codex而是 GaussDB 文档表2里那几行「权限缩小」。系统管理员在表空间上权限无变化但模式、自定义函数、自定义表或视图上都出现了「未被授予其他用户非系统模式的权限前不能访问」的描述。权限缩小是安全设计落到存量业务上却意味着要检查一批旧授权是否该回收、一批跨模式访问是否要改成显式授权。把这类重复性核对交给 Codex比对着屏幕一项项翻要省事但前提是 Codex 的模型请求能稳定发出这就是我接统一 API 的原因。1. 三权分立切换后系统管理员权限缩在哪三处1.1 角色属性CREATEROLE 和 AUDITADMIN 先确认已收走原本一个拥有 SYSADMIN 的系统管理员在默认权限模型里几乎什么都能做。GaussDB 做三权分立为的是避免系统管理员权力过度集中把「用户管理」拆给安全管理员把「审计管理」拆给审计管理员。所以切换后系统管理员虽然还是 SYSADMIN 属性但角色上不再带 CREATEROLE也不能再维护审计日志。排障时第一件事就是确认这个「不再带」。用 gsql 连到集群执行\du查看目标角色\du对照输出里每个角色的属性。如果 sysadmin_01 这一行还能看到 Create role 或 Audit admin说明三权分立没有真正生效或者切换后又被人为赋回去了。这种情况先别急着裁剪对象权限要把角色属性回归到三权分立的预期状态否则后面做的所有核查都会建立在一个错误前提上。另外注意初始用户id 为 10的权限不受三权分立影响。文档也建议初始用户只作为 DBA 管理用途而非业务应用。排障时不要拿初始用户去测「系统管理员权限是否被裁剪」测出来的结果永远是有权限容易误判。1.2 对象权限表2里真正缩小的是模式、函数、表/视图三权分立前系统管理员对所有用户自定义表、视图、函数都有所有权限三权分立后只有自己的模式是自己的地盘其他用户的非系统模式不再默认可访问。表空间是个例外系统管理员对表空间依然有创建、修改、删除、访问、分配的权限基本无变化。对象类型三权分立后系统管理员权限表空间无变化依然具有所有权限模式权限缩小只能对自己模式全权管理其他用户非系统模式无权限自定义函数未被授予其他用户非系统模式的权限前不能访问其他用户模式下的函数自定义表或视图未被授予其他用户非系统模式的权限前不能访问其他用户模式下的表或视图裁剪动作主要落在后三行。如果系统管理员账号只是用来做运维不访问业务数据那回收跨模式访问是正确方向如果它仍承担跨部门数据核对就需要其他用户显式授权走GRANT USAGE ON SCHEMA加对象级GRANT SELECT或GRANT EXECUTE。到底是回收还是补授权取决于业务用途这一步让 Codex 按清单梳理比凭印象判断要稳。实际操作时我习惯把表1和表2放在同一屏表1是默认权限模型的基线表2是切换后的差异。Codex 在核对时也会问你要这两组信息所以最好提前把角色清单整理成文本而不是截图让它靠 OCR 猜。2. 让 Codex 走 TaoToken在 config.toml 里把 Base URL 指向统一 API2.1 准备 API Key 和模型 ID要让 Codex 帮我们核对权限得先让 Codex 能正常调到大模型。我选择在 TaoToken 官网创建 API Key原因是它提供统一的 API 通道一个 Key 可以对应多种模型模型广场里能看到当前可用的模型 ID不用自己在多个厂商控制台之间横跳。打开官网注册后创建一个 Key本文统一用 YOUR_API_KEY 代替模型 ID 以 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 模型广场展示为准不在这里编造。2.2 Codex 的 model_provider 配置Codex 的配置文件在~/.codex/config.toml。如果这个文件不存在先创建目录和文件再编辑。把 model_provider 指向 TaoToken并写上 Base URL。注意这段配置和 Claude Code 那套 ANTHROPIC_BASE_URL 环境变量没有关系Codex 只认自己的 provider 配置。model YOUR_MODEL_ID model_provider taotoken [model_providers.taotoken] name TaoToken API base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY然后把 Key 放进环境变量export TAOTOKEN_API_KEYYOUR_API_KEY有两个容易混的地址要分清楚官网落地页负责注册、创建 Key、看模型广场和控制台填进 Codex 配置的接口地址必须是 https://taotoken.net/api 末尾不要加 /v1也不要把 UTM 参数拼到接口地址上。UTM 参数放在落地页链接里做渠道标识接口不认这个。2.3 先验证一次调用再开始核对配好之后先跑一条最简单的命令确认链路通不通codex exec 用一句话说明你现在是通过 TaoToken 接入模型通道如果 Codex 能正常回复说明 Base URL、Key、模型 ID 三个环节都没问题。此时再开始喂 GaussDB 权限清单否则排障时会把「模型没调通」和「权限变化没核对清楚」混在一起越来越乱。Codex 版本较老的话可能没有 exec 子命令直接运行 codex 进入交互式界面输入同样的话也可以。3. 把角色和对象权限清单贴给 Codex按表2逐项核对裁剪点3.1 给 Codex 的结构化提问把 GaussDB 的角色信息、对象归属、需要核对的权限项组织成一段清晰的问题。Codex 不知道你库里实际有什么你给的清单越完整它输出的对照越有用。可以按下面这个模板来写GaussDB 集群从非三权分立切换成三权分立。用户 sysadmin_01 原来有 SYSADMIN、CREATEROLE、AUDITADMIN 三个属性。另一个用户 finance 在模式 finance 下拥有表 t_payment、视图 v_repayment、函数 fn_settle。 请按 GaussDB 三权分立模型逐项说明 sysadmin_01 在表空间、模式、自定义函数、自定义表或视图上的权限变化并列出需要裁剪的权限点。特别注意 sysadmin_01 在未被授权 finance 模式下任何权限时能否访问 finance 模式下的表和函数。我实际提问时会把真实角色名、真实模式名和对象名替换进去。Codex 返回的答案通常会包含两大部分一部分是系统管理员应失去的权限包括角色属性层面的 CREATEROLE、AUDITADMIN以及对象层面的跨模式默认访问另一部分是仍然保留的权限例如表空间权限和对自己模式的管理权。这个输出可以直接拿去和表2比对发现不一致的地方再追问。3.2 让 Codex 输出裁剪清单再由本地 gsql 执行Codex 只负责分析和生成不负责连接你的 GaussDB。拿到它的建议后要在本地用 gsql 登录集群执行实际的REVOKE或GRANT执行完再把\du、\dp、\dn的输出贴回对话让 Codex 确认裁剪结果和预期是否一致。这里有个细节裁剪不只是REVOKE一条命令的事。系统管理员如果要去访问其他用户模式下的表需要两层授权先有模式上的USAGE再对象上的SELECT/EXECUTE。Codex 在生成授权建议时如果只给对象级授权而漏掉模式级授权仍然会报permission denied for schema。反过来只给模式授权不给对象授权表还是访问不了。所以我把「模式授权」和「对象授权」分开让 Codex 列出再对照实际执行结果。考虑到三权分立后系统管理员对角色属性的变化是由切换机制本身完成的人工要重点处理的是对象权限层。下面这组 SQL 是思路示例实际语句以你的权限清单为准REVOKE ALL ON SCHEMA finance FROM sysadmin_01; REVOKE ALL ON finance.t_payment FROM sysadmin_01; REVOKE ALL ON finance.v_repayment FROM sysadmin_01; REVOKE ALL ON FUNCTION finance.fn_settle FROM sysadmin_01;执行完再查一次授权是否清干净而不是只看 REVOKE 命令有没有报错。Codex 这一步的作用是帮你把「该回收哪些、该保留哪些」理清楚真正的手动操作留在本地。3.3 PG_STATISTIC 的例外别被裁剪掉GaussDB 文档里有个 NOTICE三权分立后系统管理员仍可通过访问 PG_STATISTIC 和 PG_STATISTIC_EXT 系统表获取高频值 MCV 等统计信息里的敏感内容。这一点很容易被忽略因为表2只看「系统管理员对其他用户模式无权限」容易让人误以为它彻底被隔离。在让 Codex 核对权限变化时可以单独把这条加进去问一句另外GaussDB 文档提到三权分立后系统管理员仍可访问 PG_STATISTIC 相关系统表获取统计信息敏感内容这个例外在裁剪时需要注意什么Codex 会提醒你权限裁剪的目的是消除不必要的对象访问但这种系统表读取属于数据库内部机制不是通过普通 GRANT 授权形成的不能用常规 REVOKE 去处理。如果业务上对 MCV 这类统计信息敏感需要考虑脱敏或从应用层规避而不是简单回收权限。4. 排障Codex 返回 401 与系统管理员权限未缩小的正确处理4.1 Codex 报错的三个常见点调用 Codex 过程中最容易遇到三类问题。第一类是 401 Unauthorized通常是 TAOTOKEN_API_KEY 没设置对或者 Key 里混入了空格、引号。第二类是模型不存在或 model not found因为 config.toml 里写的模型 ID 和模型广场展示的不一致。第三类是 404多半是 base_url 写成了 https://taotoken.net/api/v1 接口地址已经在 /api 结束再加 /v1 就找不到路由。这几个问题有一个共同特征和 GaussDB 没有任何关系纯粹是模型通道没配好。所以我在第 2 节特意要求先跑一次最简单的验证命令确定 Codex 通了再进权限核对流程。提示遇到 401 时先回官网控制台确认真实 Key 是否有效而不是反复改 base_url。Key 的创建和用量查询都在落地页里完成接口地址不负责这些事。4.2 权限裁剪看似做了实际没生效另一种排障发生在 GaussDB 侧。Codex 给出的裁剪清单里要求移除系统管理员的 CREATEROLE 和 AUDITADMIN但执行完\du一看角色属性还在。这时候先确认三权分立是否真的切换成功GaussDB 文档明确说如需使用三权分立应在数据库初始化阶段指定不建议来回切换。如果是在运行中改的需要确认参数是否生效并按要求重启或联系华为工程师确认。还有一种情况是系统管理员仍然能访问到其他用户模式下的表。用\dp finance.t_payment查看授权往往能发现是历史显式授权残留。三权分立收回的是「默认访问」不等于把所有已存在的显式授权全部清掉。Codex 可以帮你列出该回收的清单但具体回收动作要由你在本地执行执行完把结果贴回来再确认。提示权限核对和裁剪时不要把初始用户当成验证工具。初始用户权限不受三权分立影响用它的会话去访问其他用户模式永远不会触发permission denied这会掩盖真实的权限状态。4.3 Codex 不直连生产库边界说清楚在整条排障链路里Codex 是一个分析助手不直接登录 GaussDB 集群。它不会替你去执行REVOKE也不会读取生产库里的实际权限数据。所有真实的权限查询和变更都需要你在本地用 gsql 完成再把结果贴回对话。这既是安全边界也让每次裁剪都有据可查避免 Codex 误操作。如果你把业务判断也交给 Codex那要承担模型理解偏差的风险。比如「系统管理员不再默认访问其他用户模式」不等于「任何跨模式授权都必须删掉」Codex 只能根据你贴给它的清单做判断最终的业务决定要以 GaussDB 官方文档和华为工程师答复为准。5. 核完清单后回 TaoToken 控制台确认这次调用5.1 把裁剪清单和调用记录一起归档一次权限裁剪核对结束后把 Codex 输出的裁剪点、你在本地执行的 REVOKE/GRANT、以及\du的复核结果放在一起归档。归档时我通常建一个 Markdown 文件把切换前后的表1/表2、Codex 输出、实际执行的 SQL、执行后的授权查询结果按时间顺序放进去。这样如果后期有人问「为什么 sysadmin_01 访问不了 finance 模式下的表」可以直接翻到这次裁剪记录看到是哪一个时间点 REVOKE 掉的是谁建议的、谁执行的。归档时顺手打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 控制台看这次对话消耗的 token 量和模型 ID确认走的确实是预期模型。这一步对后续排障也有用如果哪天发现权限核对结果异常能通过调用记录反推是哪次对话、哪个模型给出的建议。这也是我坚持用统一接口的原因所有对话都走同一个入口账单和模型记录集中在一起不会因为换工具就散落各处。5.2 给切换操作留一条回退路径最后提醒一句三权分立不是随便切着玩的权限开关GaussDB 文档建议在数据库初始化阶段指定不要来回切换。从非三权分立切过来时重新审视已有用户权限集合是必须做的如果你的业务还没准备好切回去的成本可能比裁剪更高。拿不准的地方把 Codex 的分析结果和实际授权记录一起发给华为工程师确认再动生产库。权限裁剪的目的是让系统管理员回到「该有的权限不该有的不放」的状态Codex 帮你把这道题从人肉翻表变成逐项对照但最终按下 REVOKE 的按钮还是得你自己来。