胖头鱼的技术专栏-447 26ai新特性实战:JSON关系二元性验证指令(20260716)
数据库管理447期 2026-07-16胖头鱼的技术专栏-447 26ai新特性实战JSON关系二元性验证指令20260716特性介绍语法介绍限制适用场景实战演示创建测试表和视图测试1使用SQL表达式对INSERTBEFORE OBJECT验证测试2使用PL/SQL函数对INSERTBEFORE OBJECT验证测试3UPDATE验证BEFORE OBJECT测试4SELECT验证AFTER OBJECT查询所有验证指令总结胖头鱼的技术专栏-447 26ai新特性实战JSON关系二元性验证指令20260716作者胖头鱼的鱼缸尹海文 Oracle ACE Pro: Database PostgreSQL ACE 10年数据库行业经验 拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证 墨天轮MVPITPUB认证专家 圈内拥有“总监”称号非著名社恐社交恐怖分子 全网同名胖头鱼的鱼缸 ITPUByhw1809 除授权转载并标明出处外均为“非法”抄袭特性介绍Oracle AI Database 23.26.2为JSON关系二元性视图新增了验证指令Validation Directive功能。验证指令允许开发者以声明式的方式为Duality View 及其底层表附加补充的业务规则逻辑。验证逻辑存储在数据库中在对Duality View执行操作插入、更新、查询时自动评估执行。这为传统的应用代码或数据库触发器实现业务规则提供了一种声明式的替代方案。语法介绍CREATE[ORREPLACE]DIRECTIVE 指令名称FORDuality_View 名称 VALIDATEON(SELECT|INSERT|UPDATE)-- 可指定一个或多个操作(BEFORE OBJECT|AFTEROBJECT|ONCOMMIT)-- 处理阶段[(VALIDATE|NOVALIDATE)(ENABLE|DISABLE)]-- 可选USING(SQL表达式|PLSQL函数);处理阶段Processing StageBEFORE OBJECT - 在文档处理之前验证失败则操作不执行语句回滚AFTER OBJECT - 在文档处理之后验证失败则回滚语句并报错ON COMMIT - 在事务提交时验证失败则提交被拒绝事务回滚提供更强的事务一致性保证–验证失败行为SELECT验证失败 - 抛出错误不返回验证失败的文档INSERT/UPDATE验证失败 - 操作被拒绝语句回滚ON COMMIT验证失败 - 提交失败整个事务回滚验证逻辑支持三种形式SQL/JSON表达式如 json_value(new.data, ‘$.salary’) 10000PL/SQL函数函数签名为 (old_data JSON, new_data JSON) RETURN BOOLEANnew_data插入/更新后的文档提议版本old_data更新前的文档原始版本INSERT 时为 null返回 TRUE 表示验证通过FALSE 表示验证失败PL/SQL匿名块VALIDATE/NOVALIDATE 选项VALIDATE - 创建指令时验证现有数据如有不合规数据创建失败NOVALIDATE - 创建指令时不验证现有数据默认ENABLE/DISABLE 选项ENABLE - 创建后立即生效默认DISABLE - 创建后不生效可用 ALTER DIRECTIVE 启用错误码ORA-43589: Cannot create validation directive ‘xxxx’: Validation directives creation is not supported under the SYS schema 不能在SYS schema下创建验证指令使用SYS用户登录切换至其他SCHEMA也会报错OORA-43591: Validation failed for directive ‘xxxx’ on JSON-relational duality view ‘xxxx’ 验证失败限制不能在 SYS schema 下创建验证指令验证逻辑必须确定性且无副作用禁止 DML、ALTER SESSION、COMMIT/ROLLBACK、PRAGMA AUTONOMOUS_TRANSACTION禁止修改包状态禁止使用 UTL_HTTP、UTL_TCP、UTL_SMTP 等包存在验证指令时并行 DML 和直接加载操作会降级为串行常规 DML适用场景业务规则强制执行例如确保员工薪资在合理范围内2000 ≤ salary 10000订单状态保护已发货订单status ‘shipped’不允许添加新的订单项使用 ON COMMIT 阶段防止并发修改数据质量管控查询时验证文档完整性不返回不符合规则的文档合规审计确保插入的文档满足行业合规要求如金融交易必须包含必要字段多租户隔离验证租户不能访问或修改其他租户的数据替代触发器将原本在应用层或触发器中实现的验证逻辑下沉到数据库声明式管理实战演示创建测试表和视图CREATETABLEvd_employees(emp_id NUMBERPRIMARYKEY,emp_name VARCHAR2(100),salary NUMBER,dept VARCHAR2(30));CREATEORREPLACEJSON RELATIONAL DUALITYVIEWvd_emp_dvASSELECTJSON {_id: emp_id,name: emp_name,salary: salary,dept: dept}FROMvd_employeesWITH(INSERT,UPDATE,DELETE);测试1使用SQL表达式对INSERTBEFORE OBJECT验证CREATEDIRECTIVE salary_max_checkFORvd_emp_dv VALIDATEONINSERTBEFORE OBJECTUSINGjson_value(new.data,$.salary)10000;INSERTINTOvd_emp_dvVALUES({_id:1, name:Alice, salary:5000, dept:Engineering});INSERTINTOvd_emp_dvVALUES({_id:2, name:Bob, salary:15000, dept:Sales});salary≥10000的无法被插入。测试2使用PL/SQL函数对INSERTBEFORE OBJECT验证CREATEORREPLACEFUNCTIONcheck_min_salary(old_data JSON,new_data JSON)RETURNBOOLEANISBEGINRETURNjson_value(new_data,$.salary)2000;END;/CREATEDIRECTIVE salary_min_checkFORvd_emp_dv VALIDATEONINSERTBEFORE OBJECT NOVALIDATEUSINGcheck_min_salary;INSERTINTOvd_emp_dvVALUES({_id:3, name:Carol, salary:3000, dept:HR});INSERTINTOvd_emp_dvVALUES({_id:4, name:Dave, salary:1000, dept:Sales});salary≥2000的才能被插入。测试3UPDATE验证BEFORE OBJECTCREATEDIRECTIVE salary_update_checkFORvd_emp_dv VALIDATEONUPDATEBEFORE OBJECTUSINGjson_value(new.data,$.salary)10000;UPDATEvd_emp_dvSETdataJSON_TRANSFORM(data,SET$.salary8000)WHEREJSON_VALUE(data,$._idRETURNINGNUMBER)1;UPDATEvd_emp_dvSETdataJSON_TRANSFORM(data,SET$.salary12000)WHEREJSON_VALUE(data,$._idRETURNINGNUMBER)1;修改salary≥10000会失败。测试4SELECT验证AFTER OBJECTCREATEORREPLACEDIRECTIVE no_test_namesFORvd_emp_dv VALIDATEONSELECTAFTEROBJECT NOVALIDATEENABLEUSINGjson_value(new.data,$.name)!TEST;INSERTINTOvd_employeesVALUES(5,TEST,5000,Temp);COMMIT;SELECTdataFROMvd_emp_dvWHEREJSON_VALUE(data,$._idRETURNINGNUMBER)5;SELECTJSON_VALUE(data,$._id)ASid,JSON_VALUE(data,$.name)ASnameFROMvd_emp_dvORDERBYJSON_VALUE(data,$._idRETURNINGNUMBER);查询完整数据对于TEST文档失败。查询单个字段应成功无SELECT验证。查询所有验证指令SELECTdirective_name,object_name,on_clause,processing_stage_clause,status,using_typeFROMuser_validation_directivesWHEREobject_nameVD_EMP_DVORDERBYdirective_name;总结本期对Oracle AI Database 26ai23.26.2版本新引入的JSON关系二元性验证指令新特性进行了完整介绍与实战演示老规矩知道写了些啥。