-- ===================================================================== -- 专家(智能体)管理:用户隔离 + 内置标记 -- -- 幂等脚本(可重复执行)。项目无 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 $$;