En DB2, ¿es posible tener un solo desencadenador para actualizar e insertar?

StackOverflow https://stackoverflow.com/questions/1011673

  •  06-07-2019
  •  | 
  •  

Pregunta

Tengo que crear los desencadenantes que mantendrán la auditoría de mi tabla. Se supone que el disparador se ejecuta tanto en la inserción como en la actualización.

actualmente estoy teniendo dos disparadores

Uno para Insertar :

CREATE TRIGGER SCH.TRG_TBL1_AFT_I
  AFTER INSERT ON SCH.TBL1  
  REFERENCING
    NEW AS n
  FOR EACH ROW
 MODE DB2SQL
INSERT INTO SCH.TBL1_AUDIT
VALUES( .. ,, .. );

Otro para actualizar

CREATE TRIGGER SCH.TRG_TBL1_AFT_U
  AFTER UPDATE ON SCH.TBL1  
  REFERENCING
    NEW AS n
  FOR EACH ROW
 MODE DB2SQL
INSERT INTO SCH.TBL1_AUDIT
VALUES( .. ,, .. );

¿Pero el punto es, si es posible crear un solo disparador, en DB2, para realizar la tarea? [siempre que ambos, el disparador estén haciendo lo mismo.]

¿Fue útil?

Solución

Lo sentimos, DB2 no ofrece una forma de combinar actualizaciones e insertar disparadores juntos.

Otros consejos

Prueba esto

CREATE or replace TRIGGER PASSENGER_TR01_BEFORE_IUD
 BEFORE 
    DELETE
 OR UPDATE OF FIRST_NAME 
 OR INSERT ON PASSENGER
REFERENCING 
OLD AS oldRow
NEW AS newRow
FOR EACH ROW
WHEN (1=1) 
Begin
Declare ACTION Char(1) Default '';
-- Use Case/When to inquire trigger-event
Case 
When INSERTING Then
    Set ACTION='I';
When UPDATING  Then
    Set ACTION='U';    
When DELETING  Then
    Set ACTION='D';    
Else
    Set ACTION='N';    
End Case;

-- Use If/Then/Else to inquire trigger-event
If INSERTING Then
    Set ACTION='I';
ElseIf UPDATING  Then
    Set ACTION='U';
ElseIf DELETING  Then
    Set ACTION='D';
Else
    Set ACTION='N';    
End If;
End

Sí, es posible. Consulte la documentación de crear desencadenador . Aquí hay una pasta:

trigger-event

   .-OR--------------------------------------.   
   V                                     (4) |   
|----+-INSERT--------------------------+-----+------------------|
     +-DELETE--------------------------+         
     '-UPDATE--+---------------------+-'         
               |     .-,-----------. |           
               |     V             | |           
               '-OF----column-name-+-'   

Eso le permitiría decir:

crear disparador bla antes de insertar en bla o actualizar blah .

Puede encontrar más información aquí

 CREATE OR REPLACE TRIGGER SET_SALARY
 NO CASCADE
 BEFORE UPDATE OR INSERT ON employee
 REFERENCING NEW AS n OLD AS o
 FOR EACH ROW
 WHEN( o.edlevel IS NULL OR n.edlevel > o.edlevel )
 BEGIN
    -- Give 10% raise to existing employees with new education level.
 IF UPDATING THEN SET n.salary = n.salary * 1.1;
     -- Give starting salary based on education level.
 ELSEIF INSERTING THEN
     SET n.salary = CASE n.edlevel WHEN 18 THEN 50000
  WHEN 16 THEN 40000
         ELSE 25000
  END;
  END IF;
 END

Esta característica ahora está en la versión DB2 10.x. Ha estado disponible sine 9.7.x

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top