En DB2, ¿es posible tener un solo desencadenador para actualizar e insertar?
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.]
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