无法在 CHECK CONSTRAINT 中引用自定义函数

Posted

技术标签:

【中文标题】无法在 CHECK CONSTRAINT 中引用自定义函数【英文标题】:can't reference a custom function in a CHECK CONSTRAINT 【发布时间】:2021-02-01 10:37:45 【问题描述】:

我有一个表的列必须小于某个值,问题是这个值存储在另一个表中,所以我无法引用它,所以经过一些研究我发现我可以使用一个函数并调用它在检查约束中,这是我的功能

create or replace FUNCTION check_caution(id_cont in NUMBER)
return number
as res number ;
begin
select amount_contract*caution_offre_f*0.01 into res from contract 
where id_contract=id_cont;
return res;
end check_caution;

该功能运行良好,我对其进行了测试。 这是我的检查约束

alter table caution_exe 
add CONSTRAINT check_amount
check (caution_exe.amount_caution<=check_caution(caution_exe.id_contract));

但这是我尝试添加后得到的消息


ORA-00904: "CHECK_CAUTION": invalid identifier
00904. 00000 -  "%s: invalid identifier"

【问题讨论】:

这在 Oracle 中根本不可能 记录的限制:docs.oracle.com/database/121/SQLRF/clauses002.htm#SQLRF52205 【参考方案1】:

由于您无法在 check 约束中引用您自己的函数,因此创建一个 trigger 来完成这项工作。像这样的:

CREATE OR REPLACE TRIGGER trg_biu_cauexe
   BEFORE INSERT OR UPDATE
   ON caution_exe
   FOR EACH ROW
BEGIN
   IF :new.amount_caution <= check_caution (:new.caution_exe.id_contract)
   THEN
      raise_application_error (-20000, 'Not allowed');
   END IF;
END;

【讨论】:

以上是关于无法在 CHECK CONSTRAINT 中引用自定义函数的主要内容,如果未能解决你的问题,请参考以下文章

函数在 sql server 上的 CHECK Constraint 中不起作用

check约束怎么设置identity11

编写 CHECK CONSTRAINT 的一种更好的方法,它检查一个值是不是不为空

[Oracle]约束(constraint)

oracle04 约束,索引

springboot学习(二十二)_ 使用@Constraint注解自定义验证注解