【发布时间】: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的列,该列不存在,但运行良好。