我需要一些帮助来解决我正在尝试创建/用于在表上记录更新和插入的触发器。 我正在使用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';
是否存在任何代码错误,并且它没有返回任何行。不确定这是否有帮助。感谢。
答案 0 :(得分:0)
您已为多个DML
操作(Insert
和Update
创建了触发器,因此您需要使用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);
插入了几个其他列,修改了几行,它仍然有用。我是一个快乐的露营者,虽然我不确定它究竟是什么或如何修复。