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 只是告诉我们它是无效的。顺便问一下,为什么childsparent 的父级?而且您的定义缺少供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的主要内容,如果未能解决你的问题,请参考以下文章

ORA -04098 触发器无效且未通过重新验证

删除oracle 11g用户删除不掉,报ORA-04098错误!

ORA-04098: 简单触发器无效。为啥?

oracle 触发器抛出 ora-04098

Oracle:新增用户登录提示“ORA-04098:触发器‘GD.ON_LOGON_TRIGGER’无效且未通过重新验证”

ORA-04098 trigger 'DBBJ.DB_EV_ALTER_ST_METADATA' is invalid and failed re-validation