Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    trigger cencellazione riga

    ciao a tutti, premetto che in fatto di trigger non sono un asso
    comunque, devo fare un trigger su di una tabella che prima di essere modificata il trigger cancella le tuple checorrispondono a determinati parametri.

    mi spiego meglio

    ho una tabella prenotazioni dove c'è un campo confermata (= 0) ed uno con la data in formato anno mesi giorni ore minuti secondi.

    prima di modificare la tabella il trigger deve verificare se ci sono tuple con valore del campo confermata = 0 e se la data ATTUALE è > di 30 secondi della data di inserimento.

    ecco il mio trigger
    codice:
    delimiter //
    CREATE TRIGGER prenotazione_non_confermate
           BEFORE UPDATE ON prenotazioni
             FOR EACH ROW
             BEGIN
             IF ( TIME_TO_SEC(CURTIME()) - TIME_TO_SEC(OLD.data_prenotazione) ) > 30 AND OLD.confermata = 0 THEN DELETE FROM prenotazioni WHERE id_prenotazione = OLD.id_prenotazione;
             END IF;
             END; //
    delimiter ;
    questo codice mi fa modificare la tupla su cui voglio lavorare SE sono all'intreno dei 30 secondi, mentre se i 30 secondi sono passati la tupla non si modifica, e SOPRATTUTTO non cancella le altre!!

    potete dirmi dove sbaglio??

    GRAZIE MILLE!!!

  2. #2
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955

    Re: trigger cencellazione riga

    Originariamente inviato da danirota
    ciao a tutti, premetto che in fatto di trigger non sono un asso
    comunque, devo fare un trigger su di una tabella che prima di essere modificata il trigger cancella le tuple checorrispondono a determinati parametri.

    mi spiego meglio

    ho una tabella prenotazioni dove c'è un campo confermata (= 0) ed uno con la data in formato anno mesi giorni ore minuti secondi.

    prima di modificare la tabella il trigger deve verificare se ci sono tuple con valore del campo confermata = 0 e se la data ATTUALE è > di 30 secondi della data di inserimento.

    ecco il mio trigger
    codice:
    delimiter //
    CREATE TRIGGER prenotazione_non_confermate
           BEFORE UPDATE ON prenotazioni
             FOR EACH ROW
             BEGIN
             IF ( TIME_TO_SEC(CURTIME()) - TIME_TO_SEC(OLD.data_prenotazione) ) > 30 AND OLD.confermata = 0 THEN DELETE FROM prenotazioni WHERE id_prenotazione = OLD.id_prenotazione;
             END IF;
             END; //
    delimiter ;
    questo codice mi fa modificare la tupla su cui voglio lavorare SE sono all'intreno dei 30 secondi, mentre se i 30 secondi sono passati la tupla non si modifica, e SOPRATTUTTO non cancella le altre!!

    potete dirmi dove sbaglio??

    GRAZIE MILLE!!!
    Prova così:
    codice:
    DELETE FROM prenotazioni 
    WHERE TIME_TO_SEC(CURTIME()) - TIME_TO_SEC(data_prenotazione) ) > 30 
    AND confermata = 0;
    L'IF viene spostato nella query così cancelli le righe in un colpo solo.

    Dimmi se funziona. Cmq la prox volta specifica il DBMS

  3. #3

    Re: trigger cencellazione riga

    Oltre a quanto detto da Joe Taras,
    ti faccio notare che tu dici
    Originariamente inviato da danirota
    deve verificare ...se la data ATTUALE è > di 30 secondi della data di inserimento.
    ma poi usi time_to_sec() che agisce solo sulla parte "time" della data...

    Diciamo che curtime vale (13:00:00)
    time_to_sec(CURTIME()) = 46.800;

    la OLD.data_prenotazione che hai è 2012-10-08 12:59:55 ->
    time_to_sec('2012-10-08 12:59:55') = 46.795;

    TIME_TO_SEC(CURTIME()) - TIME_TO_SEC(OLD.data_prenotazione) =
    46.800 - 46.795 = 5
    è <30 -> OK va cancellata


    ma se la OLD.data_prenotazione è diciamo 2012-09-08 14:20:00
    cioè alle 14.20 del GIORNO PRIMA
    time_to_sec('2012-10-07 14:20:00' ) = 51.600;
    TIME_TO_SEC(CURTIME()) - TIME_TO_SEC(OLD.data_prenotazione) =
    51.600 - 46.795 = 4.800
    è > 30 secondo il trigger non va cancellata!!!!

  4. #4
    avete ragione, comunque ho dovuto lasciare il trigger perchè ho bisogno di fare un controllo prima della chiamata al db.
    Ho usato una stored procedure dove calcolo la differenza in minuti tra la data attuale NOW() e la data della tupla

    codice:
    DELETE FROM prenotazioni WHERE TIMESTAMPDIFF(MINUTE, data_prenotazione, NOW()) > 1 AND confermata = '0';

    e così funziona...

    il trigger mi sembrava migliore, ma purtroppo devo fare un controllo sul dato che sto per andare a modificare, e il trigger 'parte' solo nel momento della chiamata, quindi quel controllo non riuscivo a farlo

    GRazie a tutti!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.