PL/SQL插入数据时自动生成token触发器报ORA-04084错误求助
解决ORA-04084:无法修改该类型触发器的NEW值问题
嘿,这个错误我太熟悉了!你遇到的ORA-04084问题,核心原因是触发器的时机类型选错了——你大概率写的是AFTER INSERT触发器,但这种触发器是没法修改NEW字段值的,因为数据已经实打实插入到表里面了,此时NEW对应的行已经是只读状态。
先顺便提一句:你的建表语句里有个小语法错误,cod number(11)和token number(20)之间少了个逗号,修正后的建表语句应该是:
CREATE TABLE table_cad( codUser integer, name varchar(200), pass varchar(50), login varchar(8), email varchar(30), cod number(11), token number(20) );
接下来给你正确的触发器写法,我们需要用BEFORE INSERT行级触发器,这样在数据插入到表之前,就能修改NEW行的token字段值:
CREATE OR REPLACE TRIGGER trg_table_cad_set_token BEFORE INSERT ON table_cad FOR EACH ROW BEGIN -- 这里替换成你实际需要的token生成逻辑 -- 示例1:用序列生成唯一自增token(生产环境推荐,避免重复) -- :NEW.token := seq_table_cad_token.NEXTVAL; -- 示例2:用随机数生成19-20位的数字token(注意:随机数有极小概率重复) :NEW.token := FLOOR(DBMS_RANDOM.VALUE(POWER(10,18), POWER(10,20)-1)); END; /
关键知识点解释:
BEFORE INSERT:指定触发器在插入操作执行前触发,此时待插入的NEW行还在内存中,处于可修改状态FOR EACH ROW:行级触发器,确保每插入一行数据,就会执行一次触发器逻辑,为该行单独赋值token- 引用待插入行的字段时,必须加上冒号
:NEW.token,这是PL/SQL中引用触发器上下文变量的语法要求
如果之前你写的是AFTER INSERT触发器,那肯定会报错,因为AFTER触发器是在数据已经写入表之后触发,此时NEW行已经是只读的,无法再修改它的字段值。
内容的提问来源于stack exchange,提问作者WillGreco
相关产品推荐
相关产品推荐

