SQL 触发器错误 ORA-04098
Posted
技术标签:
【中文标题】SQL 触发器错误 ORA-04098【英文标题】:SQL Trigger Error ORA-04098 【发布时间】:2018-07-06 14:14:48 【问题描述】:我有两个名为 childs 和 parent 的表。
create table parent(
wallet_id NUMBER generated always as identity,
amount int,
customer_id int,
primary key(wallet_id),
Foreign key (customer_id) REFERENCES childs(customer_id)
);
create table childs(
customer_id number generated always as identity,
name varchar2 (255)
);
现在我想要实现的是从 childs 中获取 name,并将 wallet_id 分配给 parent table 中的 childs,因为 parent table 具有 customer_id 的外键。 为此,我创建了一个触发器。
create or replace
TRIGGER TRIGGER1
AFTER INSERT ON CHILDS
Declare
id int;
BEGIN
select MAX(customer_id) into id FROM childs;
insert into parent (customer_id ) values ( id );
END;
现在触发器已创建,但是当我在子项中插入值时,
插入子(名称)值('jarral');
现在出现以下错误:
SQL 错误:ORA-04098:触发器“SYSTEM.TRG”无效且重新验证失败 04098. 00000 - “触发器 '%s.%s' 无效并且重新验证失败” *原因:试图检索触发器以执行,但 发现无效。这也意味着编译/授权 触发器失败。 *行动:选项是解决编译/授权错误, 禁用触发器,或删除触发器。
我该如何解决?
【问题讨论】:
什么是编译错误? ORA-04098 只是告诉我们它是无效的。顺便问一下,为什么childs
是parent
的父级?而且您的定义缺少供parent
上的FK 参考的主键/唯一键,并且system
模式是为您不应该接近的Oracle 内部对象保留的。除此之外,触发器创建时不会出错。您的 insert
语句引用了一个名为 names
的列,该列不存在,但运行良好。
【参考方案1】:
我不完全确定我是否听懂了你的问题,但这就是你所追求的吗?
SQL> create table t1 ( id number generated as identity , x int);
Table created.
SQL> create table t2 ( id number generated as identity , t1_id int);
Table created.
SQL>
SQL> create or replace
2 trigger trg
3 after insert on t1
4 for each row
5 begin
6 insert into t2 (t1_id) values ( :new.id);
7 end;
8 /
Trigger created.
SQL> insert into t1 (x) values ( 0);
1 row created.
SQL> select * from t1;
ID X
---------- ----------
1 0
SQL> select * from t2;
ID T1_ID
---------- ----------
1 1
【讨论】:
以上是关于SQL 触发器错误 ORA-04098的主要内容,如果未能解决你的问题,请参考以下文章
删除oracle 11g用户删除不掉,报ORA-04098错误!
Oracle:新增用户登录提示“ORA-04098:触发器‘GD.ON_LOGON_TRIGGER’无效且未通过重新验证”
ORA-04098 trigger 'DBBJ.DB_EV_ALTER_ST_METADATA' is invalid and failed re-validation