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

Trigger no me permite Borrar todas las filas

Estas en el tema de Trigger no me permite Borrar todas las filas en el foro de Mysql en Foros del Web. Buenos dias estoy tratando de hacer un trigger que me permita copiar todas las filas de una tabla a otra cuando se cumpla una condicion ...
  #1 (permalink)  
Antiguo 20/02/2012, 12:56
 
Fecha de Ingreso: febrero-2012
Mensajes: 136
Antigüedad: 7 años, 9 meses
Puntos: 8
Trigger no me permite Borrar todas las filas

Buenos dias estoy tratando de hacer un trigger que me permita copiar todas las filas de una tabla a otra cuando se cumpla una condicion ...

El problema radica cuando una vez que ya las copie .. quiero borrar lo que ya copie .. pero no me permite no se xq ....

Luego de borrar quiero poblar la tabla con algunos datos...

No se si me hechan una manito muchas gracias ....

Código:
 -- Trigger DDL Statements
DELIMITER $$

USE `ncpp`$$

CREATE
DEFINER=`root`@`localhost`
TRIGGER `ncpp`.`Ins_temp_t_`
AFTER UPDATE ON `ncpp`.`temp_asigdefpub`
FOR EACH ROW
BEGIN
if(SELECT COUNT(*) FROM m_defpub )=(SELECT COUNT(*) FROM temp_asigdefpub WHERE b_asigdefpubEst=true) THEN

    INSERT INTO `ncpp`.`t_asigdefpub`
    (
    idasigdefpub,
    iddefpub,
    d_asigdepubFec,
    c_asigdefpubUsu,
    c_asigdefpubMaq,
    t_asigdefpubIni,
    t_asigdefpubFin,
    b_asigdefpubEst
    )

    select idasigdefpub,iddefpub,
    d_asigdepubFec,
    c_asigdefpubUsu,
    c_asigdefpubMaq,
    t_asigdefpubIni,
    t_asigdefpubFin,
    b_asigdefpubEst FROM `ncpp`.`temp_asigdefpub`;
    
    DELETE FROM temp_asigdefpub where iddefpub!=0;
    
    INSERT INTO temp_asigdefpub
    (
        iddefpub,
        b_asigdefpubEst
    )
    
    SELECT iddefpub,false FROM `ncpp`.`m_defpub`; 
     
END IF;
END
$$
  #2 (permalink)  
Antiguo 20/02/2012, 15:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.321
Antigüedad: 12 años
Puntos: 2653
Respuesta: Trigger no me permite Borrar todas las filas

Código MySQL:
Ver original
  1. ...
  2. AFTER UPDATE ON `ncpp`.`temp_asigdefpub`
  3. ...
  4. DELETE FROM temp_asigdefpub WHERE...

No puedes hacer operaciones DML (DELETE/INSERT/UPDATE) contra la misma tabla que dispara el TRIGGER, tan sencillo como eso. Y además, un TRIGGER es una tarea cerrada que no se puede invocar, y que no devuelve datos, por lo que ese SELECT final no tiene cabida en él.

Todo el proceso que estás intentando hacer es completamente ineficiente y un destructor de perfomance, si lo haces en un TRIGGER. Lo que propones tiene más sentido en un stored procedure.

Estás perdiendo la perspectiva de que un TRIGGER es una rutina que se ejecuta una vez por cada ejecución del evento que lo dispara. y en tu caso eso quiere decir que por cada vez que se haga un UPDATE en un registro de esa tabla quieres que:
1) Se vuelque el contenido completo de la tabla en otra.
2) Borrar toda la tabla del trigger.
3) Insertar dos valores inexistentes (porque no están definidos en el cuerpo del trigger) dentro de la tabla, nuevamente.
4) Realizar una consulta con SELECT a la misma tabla (que no se puede tomar, porque un TRIGGER no devuelve datos).

Todo esto, según tu, se debería ejecutar cada vez que un registro de esa tabla sea actualizado...
¿Le encuentras algún sentido?

No. Lo que propones no tiene sentido.

Empeiza por el principio y explica qué es lo que se supone que debe hacerse cuando se hace un UPDATE a la tabla y para qué.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 22/02/2012, 09:47
 
Fecha de Ingreso: febrero-2012
Mensajes: 136
Antigüedad: 7 años, 9 meses
Puntos: 8
Respuesta: Trigger no me permite Borrar todas las filas

Gracias por responderme gnzsoloyo

Bueno... soy un novato en trigger y bueno lo que quiero hacer es usar ... un trigger en una tabla ... para que despues de actuilizar mi tabla
Código:
AFTER UPDATE ON `ncpp`.`temp_asigdefpub`
... se ejecute mi logica ...

Evaluando primero un dos select
Código:
if(SELECT COUNT(*) FROM m_defpub )=(SELECT COUNT(*) FROM temp_asigdefpub WHERE b_asigdefpubEst=true) THEN
si esto es verdadero ... que me copie el contenido de la tabla a otra
Código:
INSERT INTO `ncpp`.`t_asigdefpub`
    (
    idasigdefpub,
    iddefpub,
    d_asigdepubFec,
    c_asigdefpubUsu,
    c_asigdefpubMaq,
    t_asigdefpubIni,
    t_asigdefpubFin,
    b_asigdefpubEst
    )

    select idasigdefpub,iddefpub,
    d_asigdepubFec,
    c_asigdefpubUsu,
    c_asigdefpubMaq,
    t_asigdefpubIni,
    t_asigdefpubFin,
    b_asigdefpubEst FROM `ncpp`.`temp_asigdefpub`;
Hasta esta parte me funciona ...

Pero como ya lo copie quiero borrar el origen de la copia
Código:
DELETE FROM temp_asigdefpub where iddefpub!=0;
pero no me lo permite .. supongo que es el uso del trigger q pertenece a la tabla ..

Luego de eso de borrar la tabla quiero poblar denuevo la tabla borrada
Código:
 INSERT INTO temp_asigdefpub
    (
        iddefpub,
        b_asigdefpubEst
    )
    
    SELECT iddefpub,false FROM `ncpp`.`m_defpub`;
Queria hacer este atravez de trigger no se si se podra realizar ...
Si no tendria que poner dicha logica en mi codigo fuente...

Gracias por la ayuda
...

Etiquetas: filas, permite, select, tabla, todas, trigger
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 18:29.