You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向带策略的Oracle表插入数据时触发ORA-28115检查选项违反错误

解决ORA-28115: policy with check option violation错误

ORA-28115错误是Oracle行级安全(RLS)策略开启了CHECK OPTION导致的——你的插入操作必须满足该表RLS策略的过滤规则,否则就会触发这个报错。结合你的代码,从以下几个方向排查解决:

1. 明确RLS策略的具体规则

联系DBA查询该Site表的行级安全策略,确认策略中CHECK OPTION对应的过滤条件。比如策略可能要求:

  • 必须包含某个未在你插入代码中设置的字段(如租户IDtenant_id),且该字段值需匹配当前会话的上下文
  • 某些字段的取值范围有严格限制(如site_type_id除了514外,还需关联其他字段的特定值)

2. 调整插入数据以满足策略要求

根据查到的策略规则,补充或修正插入的字段值:
比如如果策略要求site_tenant_id必须等于当前会话的租户ID,修改插入代码:

point_record = Site(
    feature_parent_site_id=fac_site_id,
    site_fed_id=site_fed_id,
    site_name=unit_desc,
    site_type_id=514,
    site_tenant_id=self.get_current_tenant_id()  # 补充策略要求的字段
)

3. 确保会话上下文一致性

RLS策略通常依赖会话变量(如SYS_CONTEXT中的参数),要保证查询和插入操作的会话上下文完全一致:

  • 检查查询前是否修改过会话变量,导致插入时上下文不匹配策略要求
  • 避免在查询和插入之间执行会改变会话上下文的操作

4. 优化“查询-插入”逻辑

原逻辑的查询可能因为RLS策略限制,无法看到所有符合条件的记录(比如其他租户的记录),导致误判为不存在而插入,进而违反策略。可以改用数据库唯一约束+异常捕获的方式替代查询判断:

  1. 先给Site表添加包含feature_parent_site_id、site_fed_id、site_name、site_type_id的唯一约束
  2. 修改代码:
try:
    point_record = Site(
        feature_parent_site_id=fac_site_id,
        site_fed_id=site_fed_id,
        site_name=unit_desc,
        site_type_id=514,
        # 补充策略要求的其他字段
    )
    self.db_session.add(point_record)
    self.db_session.commit()
except Exception as e:
    # 捕获唯一约束冲突异常,说明记录已存在
    self.db_session.rollback()

内容的提问来源于stack exchange,提问作者Ethel Patrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 01:27:33