关于 read-prod-database
用于以只读方式查询 DeepAPI 生产环境 Supabase Postgres 数据库的技能。它指导 Agent 选择查询范围、探索数据库结构并开展分析,同时保护内部使用数据和用户信息。
主要功能
- 01只读访问生产数据库
- 02客户范围与全部工作区查询模式
- 03数据库结构探索与查询示例
- 04拒绝列表与超时处理指引
- 05PII 处理和写入防护规则
适用场景
- 01分析客户使用情况与留存
- 02检查 API 请求和服务成本
- 03核实生产环境迁移版本
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ davidondrej/ skills --skill read-prod-database安装后在 Claude Code 中输入/read-prod-database确认已加载。
详细介绍
读取生产数据库(只读)
通过授权方式只读访问生产环境的 DeepAPI Supabase Postgres(ADR 0093)。此角色无法执行写入操作——切勿尝试写入。
快速开始
# env var lives in David's ~/.zshrc. NEVER `source ~/.zshrc` (breaks agent shells).
URL=${DEEPAPI_READONLY_DB_URL:-$(rg -o 'DEEPAPI_READONLY_DB_URL="([^"]+)"' -r '$1' ~/.zshrc)}
psql "$URL" -X -c "select count(*) from public.workspaces;"
状态检查:select current_user; 必须返回 agents_readonly。如果环境变量完全缺失,请停止并询问用户。
默认排除 David 和团队(ADR 0175)
每次运行使用情况/客户/PMF 查询时,都必须选择以下两种模式之一。每次都要有意识地选择:
- 仅客户(默认) — 排除 David、
@davidondrej.com团队以及 dogfood/测试工作区。 - 所有工作区 — 包含内部使用情况。仅在用户明确要求,或检查运行负载/总支出时使用。
如果工作区 ID 位于 src/config/internal-workspaces.ts 中(从中复制当前 UUID 列表),或者任何 dashboard_workspace_members 电子邮件地址属于 @davidondrej.com,则该工作区为内部工作区。将此条件添加到任何限定工作区范围的查询中:
-- customer-only scope: replace <uuids> with the list from src/config/internal-workspaces.ts
where sr.workspace_id <> all (array['<uuid-1>','<uuid-2>']::uuid[])
and not exists (
select 1 from public.dashboard_workspace_members m
where m.workspace_id = sr.workspace_id
and split_part(m.email, '@', 2) = 'davidondrej.com')
务必告知用户每个数字采用的范围——将结果标记为“仅客户(已排除 David 和团队)”或“所有工作区(包含内部工作区)”。切勿提供未标注或范围混杂的数字。
可查看和不可查看的内容
- 可对所有当前及未来的
public表执行 SELECT(拒绝列表模式),并读取所有行(该角色具有bypassrls)。 - 始终在拒绝列表中,访问时会返回
permission denied:api_keys、email_webhook_events和整个auth架构。这是有意设置的——不要申请访问权限,也不要绕过限制(例如,联接service_requests.api_key_id,而不是api_keys)。 - 防护措施:每个会话均为只读,查询超过 10s 后会被终止。
先发现架构,再查询
psql "$URL" -X -c '\dt public.*' # list tables
psql "$URL" -X -c '\d public.service_requests' # columns of one table
仓库中的架构事实来源:src/db/migrations/*.sql。
主要表:workspaces(租户)、service_requests(每次 API 调用:状态、成本、提供方)、service_usage_events(使用情况汇总)、credit_accounts / credit_ledger_entries(资金、不可变账本)、credit_reservations(预留款)、rate_limit_counters、waitlist_signups、schema_migrations(已运行的迁移)。
实用模式:
# recent requests for one workspace (route = endpoint, e.g. /v1/research/deep)
psql "$URL" -X -c "select id, route, status, created_at from public.service_requests where workspace_id = '<id>' order by created_at desc limit 20;"
# weekly returning workspaces (retention, ADR 0069) — PMF metric: apply the customer-only scope filter above
psql "$URL" -X -c "select date_trunc('week', created_at) w, count(distinct workspace_id) from public.service_requests group by 1 order by 1 desc limit 8;"
# did migration NNNN run on prod?
psql "$URL" -X -c "select version from public.schema_migrations order by version;"
故障模式
permission denied for table ...→ 表在拒绝列表中(符合预期,见上文)。canceling statement due to statement timeout→ 查询负载过重;添加筛选条件/限制,切勿循环重试同一查询。- 结果为空且出乎意料 → 使用
select current_user再次检查,并通过\dt确认表存在;不要假定数据缺失。 - 连接被拒绝/身份验证失败 → URL 或密码已更改;请询问用户(密码通过
alter role agents_readonly with password轮换)。
硬性规则
- 只读。不得执行 INSERT/UPDATE/DELETE/DDL,不得使用
set default_transaction_read_only = off,也不得通过其他方式绕过写入限制。生产环境写入由用户执行(迁移 +schema_migrations记录)。 - 查询结果包含真实用户数据(电子邮件、姓名、使用情况)。可在聊天中用于分析,但绝不能将个人身份信息(PII)或批量数据转储粘贴到提交、PR、文档或代码中。
- 设置、维护和轮换详情:
docs/external/supabase-readonly-agent-db-access.md。角色 SQL:docs/database/create-agents-readonly-role.sql。