Ver Mensaje Individual
  #3 (permalink)  
Antiguo 26/08/2015, 14:33
grexit
 
Fecha de Ingreso: julio-2015
Mensajes: 8
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Trigger After Update, capturar valores modificados.

Código MySQL:
Ver original
  1. CREATE TRIGGER `bitacora_dispositivos_update` AFTER UPDATE ON `dispositivos`
  2.  
  3. DECLARE old_id_num_serie VARCHAR(100) DEFAULT "NULL";
  4. DECLARE new_id_num_serie VARCHAR(100) DEFAULT "NULL";
  5. DECLARE old_id_tipo VARCHAR(100) DEFAULT "NULL";
  6. DECLARE new_id_tipo VARCHAR(100) DEFAULT "NULL";
  7. DECLARE old_dni VARCHAR(100) DEFAULT "NULL";
  8. DECLARE new_dni VARCHAR(100) DEFAULT "NULL";
  9. DECLARE old_fecha_alta VARCHAR(100) DEFAULT "NULL";
  10. DECLARE new_fecha_alta VARCHAR(100) DEFAULT "NULL";
  11. DECLARE old_fecha_baja VARCHAR(100) DEFAULT "NULL";
  12. DECLARE new_fecha_baja VARCHAR(100) DEFAULT "NULL";
  13. DECLARE old_modelo VARCHAR(100) DEFAULT "NULL";
  14. DECLARE new_modelo VARCHAR(100) DEFAULT "NULL";
  15. DECLARE old_id_proveedor VARCHAR(100) DEFAULT "NULL";
  16. DECLARE new_id_proveedor VARCHAR(100) DEFAULT "NULL";
  17. DECLARE old_id_fabricante VARCHAR(100) DEFAULT "NULL";
  18. DECLARE new_id_fabricante VARCHAR(100) DEFAULT "NULL";
  19. DECLARE old_uso VARCHAR(100) DEFAULT "NULL";
  20. DECLARE new_uso VARCHAR(100) DEFAULT "NULL";
  21. DECLARE old_id_ubicacion VARCHAR(100) DEFAULT "NULL";
  22. DECLARE new_id_ubicacion VARCHAR(100) DEFAULT "NULL";
  23. DECLARE old_num_factura VARCHAR(100) DEFAULT "NULL";
  24. DECLARE new_num_factura VARCHAR(100) DEFAULT "NULL";
  25.  
  26. DECLARE cad VARCHAR(1000) DEFAULT "";
  27.  
  28. DECLARE v_col VARCHAR (50);
  29.  
  30.  
  31. IF OLD.id_num_serie IS NOT NULL THEN
  32.         SET old_id_num_serie = OLD.id_num_serie;
  33.  
  34. IF NEW.id_num_serie IS NOT NULL THEN
  35.         SET new_id_num_serie = NEW.id_num_serie;
  36.  
  37. IF OLD.id_tipo IS NOT NULL THEN
  38.         SET old_id_tipo = OLD.id_tipo;
  39.  
  40. IF NEW.id_tipo IS NOT NULL THEN
  41.         SET new_id_tipo = NEW.id_tipo;
  42.  
  43. IF OLD.dni IS NOT NULL THEN
  44.         SET old_dni = OLD.dni;
  45.  
  46. IF NEW.dni IS NOT NULL THEN
  47.         SET new_dni = NEW.dni;
  48.  
  49. IF OLD.fecha_alta IS NOT NULL THEN
  50.         SET old_fecha_alta = OLD.fecha_alta;
  51.  
  52. IF NEW.fecha_alta IS NOT NULL THEN
  53.         SET new_fecha_alta = NEW.fecha_alta;
  54.  
  55. IF OLD.fecha_baja IS NOT NULL THEN
  56.         SET old_fecha_baja = OLD.fecha_baja;
  57.  
  58. IF NEW.fecha_baja IS NOT NULL THEN
  59.         SET new_fecha_baja = NEW.fecha_baja;
  60.  
  61. IF OLD.modelo IS NOT NULL THEN
  62.         SET old_modelo = OLD.modelo;
  63.  
  64. IF NEW.modelo IS NOT NULL THEN
  65.         SET new_modelo = NEW.modelo;
  66.  
  67. IF OLD.id_proveedor IS NOT NULL THEN
  68.         SET old_id_proveedor = OLD.id_proveedor;
  69.  
  70. IF NEW.id_proveedor IS NOT NULL THEN
  71.         SET new_id_proveedor = NEW.id_proveedor;
  72.  
  73. IF OLD.id_fabricante IS NOT NULL THEN
  74.         SET old_id_fabricante = OLD.id_fabricante;
  75.  
  76. IF NEW.id_fabricante IS NOT NULL THEN
  77.         SET new_id_fabricante = NEW.id_fabricante;
  78.  
  79. IF OLD.uso IS NOT NULL THEN
  80.         SET old_uso = OLD.uso;
  81.  
  82. IF NEW.uso IS NOT NULL THEN
  83.         SET new_uso = NEW.uso;
  84.  
  85. IF OLD.id_ubicacion IS NOT NULL THEN
  86.         SET old_id_ubicacion = OLD.id_ubicacion;
  87.  
  88. IF NEW.id_ubicacion IS NOT NULL THEN
  89.         SET new_id_ubicacion = NEW.id_ubicacion;
  90.  
  91. IF OLD.num_factura IS NOT NULL THEN
  92.         SET old_num_factura = OLD.num_factura;
  93.  
  94. IF NEW.num_factura IS NOT NULL THEN
  95.         SET new_num_factura = NEW.num_factura;
  96.  
  97.  
  98. IF old_id_num_serie != new_id_num_serie THEN
  99.     SET cad = CONCAT("id_num_serie:",old_id_num_serie,":",new_id_num_serie,";");
  100.  
  101. IF old_id_tipo != new_id_tipo THEN
  102.     SET cad = CONCAT(cad,"id_tipo:",old_id_tipo,":",new_id_tipo,";");
  103. END IF;    
  104.          
  105. IF old_dni != new_dni THEN
  106.     SET cad = CONCAT(cad,"dni:",old_dni,":",new_dni,";");
  107.  
  108. IF old_fecha_alta != old_fecha_alta THEN
  109.     SET cad = CONCAT(cad,"fecha_alta:",old_fecha_alta,":",new_fecha_alta,";");
  110.  
  111. IF old_fecha_baja != new_fecha_baja THEN
  112.     SET cad = CONCAT(cad,"fecha_baja:",old_fecha_baja,":",new_fecha_baja,";");
  113.  
  114. IF old_modelo != new_modelo THEN
  115.     SET cad = CONCAT(cad,"modelo:",old_modelo,":",new_modelo,";");
  116. END IF;    
  117.  
  118. IF old_id_proveedor != new_id_proveedor THEN   
  119.     SET cad = CONCAT(cad,"id_proveedor:",old_id_proveedor,":",new_id_proveedor,";");
  120.  
  121. IF old_id_fabricante != new_id_fabricante THEN
  122.     SET cad = CONCAT(cad,"id_fabricante:",old_id_fabricante,":",new_id_fabricante,";");
  123.  
  124. IF old_uso != new_uso THEN
  125.     SET cad = CONCAT(cad,"uso:",new_uso,":",old_uso,";");
  126. END IF;    
  127.  
  128. IF old_id_ubicacion != new_id_ubicacion THEN
  129.     SET cad = CONCAT(cad,"id_ubicacion:",old_id_ubicacion,":",new_id_ubicacion,";");
  130.  
  131. IF old_num_factura != new_num_factura THEN
  132.     SET cad = CONCAT(cad,"num_factura:",old_num_factura,":",old_num_factura,";");
  133. END IF;    
  134.  
  135. IF cad != "" THEN
  136.  
  137.     INSERT INTO bitacora
  138.     (operacion, usuario_gestion, permiso, tabla, clave_primaria, campo_valor, fecha_movimiento)
  139.     VALUES ('Update', 'user', 'permiso', 'dispositivos', new_id_num_serie, cad, SYSDATE());
  140.  
  141.  


Sin utilizar un bucle sólo he podido hacerlo funcionar de esta forma. Cómo podría mejorar el trigger y ahorrarme líneas de código ¿? No me parece nada eficiente.