在审计中触发两个表

Trigger of two tables in an audit

提问人:Anthony Nuñez 提问时间:11/20/2022 最后编辑:LittlefootAnthony Nuñez 更新时间:11/20/2022 访问量:13

问:

早上好,我正在尝试审核两个表,并且我已经调查过它无法完成,因此我解释了我想做什么:

  1. 我有两个表(Participante、Actividad),它们由第三个表(Part_Actividad)连接
  2. 我想审核 Participants(参与者)表,但同样,我需要活动的 Id 来了解参与者的数据在哪个活动中发生了更改。

我的想法

  1. 创建如下所示的触发器

创建或替换触发器Tri_Auditoria 在 Participante 上插入后 对于每一行 宣 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;

/ 结果: 当我将数据插入参与者表时,它不会插入,并且会发送触发错误。

Oracle PLSQL 触发器 语法错误

评论


答:

0赞 Littlefoot 11/20/2022 #1

突变表错误,不是吗?这是因为您正在从导致触发器触发的同一表中进行选择,这是不允许的。

无论如何,你不应该这样做,因为你有这个值在处置中 - 只需使用伪记录引用它,例如: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;
/