| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- -- =====================================================================
- -- 专家(智能体)管理:用户隔离 + 内置标记
- --
- -- 幂等脚本(可重复执行)。项目无 Flyway,按 sql/ 目录既有约定手工执行。
- --
- -- 语义:
- -- is_builtin = 1 内置专家:全局可见、不可编辑、不可删除
- -- is_builtin = 0 用户自建:仅创建者可见(user_id 过滤)、可编辑可删除
- -- user_id 创建者(sa-token 登录用户 ID);内置专家为 1(平台管理员)
- --
- -- 注:skills_allow_json / tools_allow_json 两列实体早已映射且对话链路可用,
- -- 正常部署应已存在;这里仅做兜底核对。
- -- =====================================================================
- ALTER TABLE agent ADD COLUMN IF NOT EXISTS user_id BIGINT;
- ALTER TABLE agent ADD COLUMN IF NOT EXISTS is_builtin SMALLINT NOT NULL DEFAULT 0;
- ALTER TABLE agent ADD COLUMN IF NOT EXISTS skills_allow_json TEXT;
- ALTER TABLE agent ADD COLUMN IF NOT EXISTS tools_allow_json TEXT;
- CREATE INDEX IF NOT EXISTS idx_agent_user_id ON agent(user_id);
- -- 存量 agent(含默认 agent row_id=1)一律视为内置、归属平台管理员
- UPDATE agent SET is_builtin = 1, user_id = COALESCE(user_id, 1) WHERE user_id IS NULL;
- -- =====================================================================
- -- 修复存量 identity 序列与主键(幂等)
- --
- -- 背景:存量 row_id=1(数刃)是显式插入的,没走 identity 序列,导致
- -- ① 序列仍从 1 起,新建专家拿到重复的 row_id;
- -- ② 表上没有主键,重复 id 直接落库,selectById 报「found: 2」。
- -- =====================================================================
- -- 清掉重复 id 的脏行(保留 is_builtin=1 的内置行)
- DELETE FROM agent WHERE row_id = 1 AND is_builtin = 0;
- -- 序列对齐到当前最大 id(下一次 nextval 返回 max+1)
- SELECT setval('public.dataagent_agent_row_id_seq',
- GREATEST((SELECT COALESCE(MAX(row_id), 0) FROM agent), 1));
- -- 补主键:行 id 唯一是 selectById/会话绑定的前提
- DO $$
- BEGIN
- IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conrelid = 'agent'::regclass AND contype = 'p') THEN
- ALTER TABLE agent ADD CONSTRAINT agent_pkey PRIMARY KEY (row_id);
- END IF;
- END $$;
|