sql error 04098无效的触发器

时间:2015-02-14 19:40:32

标签: sql oracle

我需要一些帮助来解决我正在尝试创建/用于在表上记录更新和插入的触发器。 我正在使用customers_history表来跟踪在customers表上进行的所有更改。

CREATE TABLE customers (
custID INTEGER PRIMARY KEY,
custFName VARCHAR2(30),
custLName VARCHAR2(30),
custState CHAR(20),
custZip NUMBER(5)
);
-- log inserts and updates on customers table
CREATE TABLE customers_history (
histID INTEGER PRIMARY KEY,
cID INTEGER, 
cFName VARCHAR2(30), 
cLName VARCHAR2(30), 
cState CHAR(20), 
cZip NUMBER(5)
);

另外,对于histID,我使用一个序列来自动递增customers_history表上的histID。

CREATE SEQUENCE ch_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1;

CREATE OR REPLACE TRIGGER audit_customers
BEFORE UPDATE 
OR INSERT ON customers
FOR EACH ROW
BEGIN
INSERT INTO customers_history(histID,cID,cFName,cLName,cState,cZip)
VALUES(ch_seq.nextval,:NEW.custID,:NEW.custFName,:NEW.custLName,
:NEW.custState,:NEW.custZip);
END;
/

在创建触发器之前,我一直在客户上插入两行,它们工作正常。创建触发器后,它不允许我在客户上插入任何行,它也会抛出ORA-04098: trigger 'SYSTEM.AUDIT_CUSTOMERS' is invalid and failed re-validation 04098. 00000 - "trigger '%s.%s' is invalid and failed re-validation"错误消息。

我试图查看使用select * from user_errors where type = 'TRIGGER' and name = 'audit_customers';是否存在任何代码错误,并且它没有返回任何行。不确定这是否有帮助。感谢。

2 个答案:

答案 0 :(得分:0)

您已为多个DML操作(InsertUpdate创建了触发器,因此您需要使用DML和{IF INSERTING THEN....END IF;操作来指定IF UPDATING THEN....END IF;操作{1}}例如:

CREATE OR REPLACE TRIGGER audit_customers
BEFORE UPDATE 
OR INSERT ON customers
FOR EACH ROW
BEGIN
IF INSERTING THEN 
INSERT INTO customers_history(histID,cID,cFName,cLName,cState,cZip)
VALUES(ch_seq.nextval,:NEW.custID,:NEW.custFName,:NEW.custLName,
:NEW.custState,:NEW.custZip);
END IF;
END;
/

答案 1 :(得分:0)

我经历过并改变了一些事情,它似乎适用于插入和更新操作。我删除了表,序列和触发器,然后尝试了以下代码,它现在正常工作。谢谢大家的时间和投入!

CREATE TABLE customers (
custID INTEGER,
custFName VARCHAR2(30),
custLName VARCHAR2(30),
custState CHAR(20),
custZip NUMBER(5)
);
CREATE TABLE customers_history (
histID INTEGER,
cID INTEGER, 
cFName VARCHAR2(30), 
cLName VARCHAR2(30), 
cState CHAR(20), 
cZip NUMBER(5)
);
CREATE OR REPLACE TRIGGER audit_customers
BEFORE UPDATE 
OR INSERT ON customers
FOR EACH ROW
BEGIN
INSERT INTO customers_history(
histID,
cID,
cFName,
cLName,
cState,
cZip
)
VALUES(
ch_seq.nextval,
:new.custID,
:new.custFName,
:new.custLName,
:new.custState,
:new.custZip
);
END;
/

我使用了与之前相同的序列代码,添加了几行,并且它有效。然后我通过添加主键

来更改了两个表

ALTER TABLE customers ADD PRIMARY KEY(custID); ALTER TABLE customers_history ADD PRIMARY KEY(histID);

插入了几个其他列,修改了几行,它仍然有用。我是一个快乐的露营者,虽然我不确定它究竟是什么或如何修复。