错误代码4098,SQL状态42000:ORA-04098:触发器'HR.TRGM_ID'无效,并且重新验证失败
我遇到了这个问题。我该怎么办?
create table kids(
id integer primary key,
mbrand varchar(100) ,
mmodel varchar(100),
mprice integer,
mquantity integer,
mdescription varchar(100),
mphoto varchar(100)
);
CREATE SEQUENCE id_seq;
create trigger trgk_id
before insert on kids
for each row
begin
select id_seq.nextval
into :new.id
from dual;
答案 0 :(得分:2)
似乎您不应该做任何事情。就您发布的代码而言,一切正常(除了END
丢失的事实)。
另一方面,Oracle抱怨触发器的名称为TRGM_ID
,而我们拥有其代码的触发器名为TRGK_ID
。我们在谈论同一触发因素吗?
SQL> create table kids(
2 id integer primary key,
3 mbrand varchar(100) ,
4 mmodel varchar(100),
5 mprice integer,
6 mquantity integer,
7 mdescription varchar(100),
8 mphoto varchar(100)
9 );
Table created.
SQL> CREATE SEQUENCE id_seq;
Sequence created.
SQL> create trigger trgk_id
2 before insert on kids
3 for each row
4 begin
5 select id_seq.nextval
6 into :new.id
7 from dual;
8 end;
9 /
Trigger created.
SQL> insert into kids (mbrand) values ('Nike');
1 row created.
SQL> select id, mbrand from kids;
ID MBRAND
---------- ----------
1 Nike
SQL>
答案 1 :(得分:2)
问题很简单,您的触发器缺少END语句。将触发器改写为
create OR REPLACE trigger trgk_id
before insert on kids
for each row
begin
select id_seq.nextval
into :new.id
from dual;
END TRGK_ID; -- added
你应该很好。
答案 2 :(得分:1)
对于
Oracle11g
,无需使用currval
和nextval
伪列 在SQL查询语句中,而在PL / SQL中可用 表达。
因此,请避免使用:
select id_seq.nextval
into :new.id
from dual;
并直接使用
:new.id := id_seq.nextval;
相反。
P.S。当然,请在完成在触发器的末尾添加end
子句的主要问题后执行上述操作。
答案 3 :(得分:0)
错误说“ TRGM_ID”(带有“ m”):
Error code 4098, SQL state 42000: ORA-04098: trigger 'HR.TRGM_ID' is invalid and failed re-validation
您的代码说“ TRGK_ID”(带有“ k”):
create trigger trgk_id
检查“ TRGM_ID”代码,或尝试重新编译触发器:
alter trigger [nameOfTrigger] compile;
答案 4 :(得分:0)
如果使用的是Oracle 12c或更高版本,则可以使用标识列,而不是手动创建序列和触发器。更清洁:
create table kids(
id integer generated always as identity primary key,
mbrand varchar(100) ,
mmodel varchar(100),
mprice integer,
mquantity integer,
mdescription varchar(100),
mphoto varchar(100)
);
https://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1