Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Trigger After Update, capturar valores modificados.

Estas en el tema de Trigger After Update, capturar valores modificados. en el foro de Mysql en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original BEGIN   DECLARE cad VARCHAR ( 1000 ) DEFAULT "" ;   DECLARE v_col VARCHAR ( 50 ) ; ...
  #1 (permalink)  
Antiguo 20/08/2015, 10:03
 
Fecha de Ingreso: julio-2015
Mensajes: 8
Antigüedad: 8 años, 9 meses
Puntos: 0
Trigger After Update, capturar valores modificados.

Código MySQL:
Ver original
  1.  
  2. DECLARE cad VARCHAR(1000) DEFAULT "";
  3.  
  4. DECLARE v_col VARCHAR (50);
  5.  
  6. DECLARE  c_col_dispositivos CURSOR FOR
  7. SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'dispositivos';
  8.  
  9. OPEN c_col_dispositivos;
  10.  
  11. get_columns: LOOP
  12.  
  13.  FETCH c_col_dispositivos INTO v_col;
  14.  
  15.     IF OLD.v_col != NEW.v_col THEN
  16.  
  17.     SET cad = CONCAT(cad," ",v_col,":",OLD.v_col,":",NEW.v_col,";");
  18.  
  19.     END IF;
  20.  
  21. END LOOP get_columns;
  22.  
  23. CLOSE c_col_dispositivos;
  24.      
  25. INSERT INTO bitacora
  26. (operacion, usuario_gestion, permiso, tabla, campo_valor, fecha_movimiento)
  27. VALUES ('Update', 'user', 'permiso', 'dispositivos', cad, SYSDATE());
  28.  


Como ya he escrito en el título se trata de un disparador AFTER UPDATE. La operación que debe realizar es muy simple, almacenar los campos modificados de la tabla "dispositivos" así como sus anteriores valores y los nuevos en un sólo campo de la tabla "bitacora". Se me ha ocurrido hacer una consulta para obtener todos los campos de la tabla "dispositivos", recorrerlos y operar con ellos con OLD y NEW pero el invento no me ha funcionado, no me reconoce el VARCHAR con el nombre de la tabla como una columna de dispositivos. Qué solución tiene ¿?

thx
  #2 (permalink)  
Antiguo 21/08/2015, 02:17
 
Fecha de Ingreso: julio-2015
Mensajes: 8
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Trigger After Update, capturar valores modificados.

alguien puede darme una idea pls ¿?
  #3 (permalink)  
Antiguo 26/08/2015, 14:33
 
Fecha de Ingreso: julio-2015
Mensajes: 8
Antigüedad: 8 años, 9 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.

Etiquetas: campo, fecha, select, tabla, trigger, update
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:05.