es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

DB2: El trigger no funciona en la fila insertada.

Tengo una aplicación que escribe datos específicos del usuario en una tabla de db2 y necesito anonimizar algunos de ellos sin tener acceso al código de la aplicación.
Así que creé un desencadenador que debería reemplazar los valores de las celdas recién creadas en la INSERCIÓN:

db2 create trigger anonimizador
  after insert on my.users for each statement mode db2sql
  update my.users set DISPLAY_NAME='Anónimo'

El desencadenador funciona y realiza correctamente la anonimización para todas las filas EXCEPTO la recién creada.
¿Cómo puedo hacer que el desencadenador cambie TODAS las filas?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el desencadenador actual es que está actualizando la misma tabla en la que se desencadena, lo que causa un bucle infinito. Para solucionar esto, puedes crear una tabla temporal para almacenar los datos antes de anonimizarlos, y luego insertar los datos anonimizados de vuelta en la tabla original. Aquí tienes un ejemplo de cómo modificar el desencadenador:

    db2 create trigger anonimizador
      after insert on my.users 
      referencing new as n
      for each row
      mode db2sql
      begin atomic
        declare temp_display_name varchar(50);
        set temp_display_name = 'Anónimo';
        insert into my.temp_users (user_id, display_name) values (n.user_id, temp_display_name);
      end
    
    db2 create trigger actualizar_usuarios
      after insert on my.temp_users 
      referencing new as n
      for each row
      mode db2sql
      update my.users set display_name = n.display_name where user_id = n.user_id;
    

    Este desencadenador crea una tabla temporal llamada “temp_users” e inserta los datos recién creados en ella. Luego, un segundo desencadenador llamado “actualizar_usuarios” actualiza la tabla original “users” con los datos anonimizados de la tabla temporal. Esto asegura que todas las filas estén anonimizadas, incluida la recién creada.

Comments are closed.