查询拦截策略
查询拦截策略用于约束表和视图的访问方式,例如禁止访问敏感对象、要求查询使用投影,或要求大表查询包含业务过滤条件。不满足规则的查询会被拒绝,并返回规则及拒绝原因。
前置条件与入口
在“平台管理 → 安全管理 → 查询拦截策略”进入管理页面。需具备相应菜单和操作权限;引擎侧管理规则要求目标集群管理员权限。策略按集群隔离,配置前应确认当前集群。
适用对象必须是 AIR 中已存在的表或视图。一个规则可包含多个同类型对象;同一集群内同一对象只能属于一条规则,已停用规则也占用该对象。
选择规则
| 对象类型 | 规则 | 生效含义 |
|---|---|---|
| 表 | 禁止查询 | SQL 直接读取该表,或最终执行计划仍扫描该表时拒绝执行 |
| 表 | 必须命中投影 | 最终执行计划不能继续扫描该原表;没有可用投影完成替换时拒绝执行 |
| 表 | 必须包含字段条件 | 每次扫描该表都必须包含至少一个指定字段上的有效过滤条件 |
| 视图 | 禁止查询 | 查询实际展开该视图前拒绝执行,不尝试明细投影替代 |
| 视图 | 必须命中明细投影 | 访问该视图必须命中对应明细投影,否则拒绝执行 |
配置步骤
- 点击“新建查询拦截策略”,填写名称和可选描述。
- 选择对象类型,填写适用对象的完整路径,例如
sales/public/orders。多个对象用回车或逗号分隔。 - 选择规则类型。对于“必须包含字段条件”,填写条件字段,例如
order_date、region。 - 保存规则,检查列表中的启用状态;需要执行约束时启用规则。
- 使用代表性查询验证允许和拒绝两种情况。修改规则或启停后,对后续查询重新验证。
名称去除首尾空格后为 1~128 个字符,同一集群内区分大小写唯一;描述最长 1024 个字符。条件字段须存在于全部适用表中,且元数据解析后的实际字段名(含大小写)一致。
示例与验证
假设 sales.public.orders 的规则为“必须包含字段条件”,条件字段为 order_date、region:
-- 至少限制一个条件字段。
SELECT order_id, amount
FROM sales.public.orders
WHERE order_date >= DATE '2026-10-01';
-- 不包含条件字段,应被拒绝。
SELECT order_id, amount FROM sales.public.orders;
比较、IN、BETWEEN、IS NULL、IS NOT NULL 等可用于有效过滤。多字段按“满足任一字段”判断,但 OR 的每个分支都必须具备有效限制。例如 region = 'CN' OR amount > 0 的第二个分支未限制配置字段,不能满足该规则。自关联等多次扫描场景需分别满足条件。
对于必须命中投影的规则,应分别用投影可用和不可用的查询检查执行结果,并通过执行计划核对原表是否仍被扫描。规则不会自动创建或刷新投影。
状态与注意事项
| 引擎状态 | 含义与处理 |
|---|---|
ACTIVE |
规则处于生效状态 |
DISABLED |
规则已停用 |
INVALID_TARGET |
目标对象失效,检查表或视图是否已删除 |
INVALID_CONFIGURATION |
配置失效,检查字段等依赖 |
UNKNOWN |
暂时无法判定,检查元数据服务,不应直接视为对象删除 |
多对象规则中,一个对象失效不代表其他有效对象停止执行约束。对象删除后规则仍保留;同路径、同类型对象重建后可恢复生效,应检查是否仍符合业务要求。
策略拒绝对应引擎错误码 SQL_INTERCEPTION_ERROR。先按错误中的目标、规则及阶段检查,不要直接移除限制以绕过问题。该功能约束查询访问方式,数据访问授权和行级过滤仍由安全管理负责。