多租户插件对每张表依次判断逻辑

AI 驱动代码审查实战

Claude code-review 插件深度解析,把 AI 智能审查接进 CI/CD 流水线

根因找到了,是多租户拦截器搞的鬼。

---

## 真正根因:多租户插件注入了 `tenant_id` 条件

日志中的异常堆栈非常明确:

```
java.sql.SQLSyntaxErrorException: Unknown column 'tenant_id' in 'where clause'

实际生成 SQL:
SELECT COUNT(*) AS total FROM archive_interface_user WHERE deleted = 0 AND tenant_id = 1
```

`deleted = 0` 在补全列后已正常工作,但 **`tenant_id = 1` 是项目多租户插件 `TenantDatabaseInterceptor` 自动注入的**,而 `archive_interface_user` 表没有这个列。

---

### 拦截器判定逻辑

多租户插件对每张表依次判断:

| 条件 | InterfaceUserDO 的结果 |
|---|---|
| ① `TableInfo` 是否为 null | 否(有 `@TableName`) |
| ② 是否继承 `TenantBaseDO` | 否(继承的是 `BaseDO`) |
| ③ 是否标注 `@TenantIgnore` | 否(没加) |

三个条件全不满足 → `ignoreTable` 返回 false → 强制追加 `AND tenant_id = 1` → 表缺列 → 500。

---

### 修复方案

**推荐:给 `InterfaceUserDO` 加 `@TenantIgnore` 注解**(该表是 OA 同步账号配置表,不需要租户隔离,侵入性最小):

```java
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;

@TableName("archive_interface_user")
@KeySequence("archive_interface_user_seq")
@TenantIgnore   // ← 加这一行即可
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class InterfaceUserDO extends BaseDO {
    // ...
}
```

AI 驱动代码审查实战

Claude code-review 插件深度解析,把 AI 智能审查接进 CI/CD 流水线

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值