早上好,我正在尝试审计两个表,并且我已经调查了它不能做,因此我解释了我想做的事情:
- 我有两个表(Participante, Actividad),它们由第三个表(Part_Actividad)连接
- 我想审计参与者表,但是以同样的方式,我需要活动的Id来知道在哪个活动中参与者的数据被更改了。
Ideas I had
- 创建如下触发器
创建或替换触发器Tri_Auditoria在插入参与者之后对于每一行声明v_Participante_ID Participante.Participante_ID %类型;v_Actividad_ID Part_Actividad.Actividad_ID %类型;
BEGIN
SELECT participante_ID INTO v_Participante_ID
FROM Participante;
SELECT Actividad_ID INTO v_Actividad_ID
FROM Part_Actividad
WHERE PartAct_ID = v_Participante_ID;
INSERT INTO Auditoria(Auditoria_ID, Actividad_ID, Participante_ID, TipPart_ID_Ant, Part_P_Nombre_Ant, Part_P_Apell_Ant, Part_Cedula_Ant, Part_Genero_ant, Part_FNaci_Ant, Aud_Operacion, Usuario_Modificador, Fecha_Modificacion)
VALUES (sec_Auditoria.nextval, v_Actividad_ID, :new.Participante_ID,:new.TipPart_ID,:new.Part_P_Nom,:new.Part_P_Apell,:new.Part_Cedula,:new.Part_Genero,:new.Part_FNaci,'I',USER,sysdate);
END Tri_Auditoria;
/结果:当我向参与者表中插入数据时,它没有被插入,并发送一个触发错误。
变异表错误,不是吗?这是因为你选择的是导致trigger触发的同一个表,而这是不允许的。
无论如何,您不应该这样做,因为您在处置中有该值-只需使用:new
伪记录引用它,例如
CREATE OR REPLACE TRIGGER Tri_Auditoria
AFTER INSERT ON Participante
FOR EACH ROW
DECLARE
v_Actividad_ID Part_Actividad.Actividad_ID%TYPE;
BEGIN
SELECT Actividad_ID
INTO v_Actividad_ID
FROM Part_Actividad
WHERE PartAct_ID = :new.participante_ID; --> this
INSERT INTO Auditoria
(Auditoria_ID, Actividad_ID, Participante_ID,
TipPart_ID_Ant, Part_P_Nombre_Ant, Part_P_Apell_Ant,
Part_Cedula_Ant, Part_Genero_ant, Part_FNaci_Ant,
Aud_Operacion, Usuario_Modificador, Fecha_Modificacion)
VALUES (sec_Auditoria.nextval, v_Actividad_ID, :new.Participante_ID,
:new.TipPart_ID,:new.Part_P_Nom,:new.Part_P_Apell,
:new.Part_Cedula,:new.Part_Genero,:new.Part_FNaci,
'I',USER,sysdate);
END Tri_Auditoria;
/