Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Aiuto Trigger MySQL

  1. #1

    [PostgreSQL]Aiuto Trigger MySQL

    salve a tutti!sono nuovo di qui e volevo un aiuto per la costruzione di un trigger MySQL.

    Ho 2 tabelle:PROGETTO e ARCHIVIO_PROGETTI

    PROGETTO

    CODICE
    123456
    654321

    NOME
    ciao
    ciaociao

    DATA_IN_PREV
    2012-05-02
    2012-05-03

    DATA_IN_EFF
    null
    null

    DATA_FI_PREV
    2012-05-18
    2012-06-18

    DATA_FI_EFF
    null
    null

    COD_FIS_INGEGNERE
    aaa
    bbb

    ARCHIVIO_PROGETTI ha gli stessi campi

    in ARCHIVIO_PROGETTI devo inserire con un trigger tutti i progetti che hanno superato la DATA_FI_PREV. io avevo provato a fare in questo modo


    DELIMITER |
    CREATE TRIGGER aggiorna_archiviati AFTER INSERT ON progetto FOR EACH ROW
    INSERT INTO archivio_progetti (SELECT * FROM progetto WHERE data_f_prev < CURDATE());
    |

    così facendo per il primo inserimento non c'è nessun problema,fa esattamente il suo dovere. ma per il secondo inserimento va a generare dei duplicati nella tabella ARCHIVIO_PROGETTI.

    come faccio a dire al trigger che non deve prendere in considerazione la riga che ha già inserito in ARCHIVIO_PROGETTI???

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

    Re: [PostgreSQL]Aiuto Trigger MySQL

    Originariamente inviato da fraguerr
    salve a tutti!sono nuovo di qui e volevo un aiuto per la costruzione di un trigger MySQL.

    Ho 2 tabelle:PROGETTO e ARCHIVIO_PROGETTI

    PROGETTO

    CODICE
    123456
    654321

    NOME
    ciao
    ciaociao

    DATA_IN_PREV
    2012-05-02
    2012-05-03

    DATA_IN_EFF
    null
    null

    DATA_FI_PREV
    2012-05-18
    2012-06-18

    DATA_FI_EFF
    null
    null

    COD_FIS_INGEGNERE
    aaa
    bbb

    ARCHIVIO_PROGETTI ha gli stessi campi

    in ARCHIVIO_PROGETTI devo inserire con un trigger tutti i progetti che hanno superato la DATA_FI_PREV. io avevo provato a fare in questo modo


    DELIMITER |
    CREATE TRIGGER aggiorna_archiviati AFTER INSERT ON progetto FOR EACH ROW
    INSERT INTO archivio_progetti (SELECT * FROM progetto WHERE data_f_prev < CURDATE());
    |

    così facendo per il primo inserimento non c'è nessun problema,fa esattamente il suo dovere. ma per il secondo inserimento va a generare dei duplicati nella tabella ARCHIVIO_PROGETTI.

    come faccio a dire al trigger che non deve prendere in considerazione la riga che ha già inserito in ARCHIVIO_PROGETTI???
    Innanzitutto non capisco una cosa, se inserisci oggi un contratto con data pari o successiva a quella corrente, il tuo contratto non deve MAI andare nell'archivio?

    Il trigger sulla INSERT agisce solo quando fai una INSERT sulla tabella, io per popolare la tabella di archivio immaginerei più un batch o una procedura che viene eseguita giorno per giorno.

    Se cmq dovessi mantenere il trigger per evitare i duplicati basta completare la tua insert...select con una condizione di not exists sulla tabella archivio_progetti

  3. #3
    si esatto,mi interessa inserire in ARCHIVIO_PROGETTI solo i progetti che hanno superato la DATA_FI_PREV. so bene che potrei usare le batch,ma mi interessa mantenere la funzione del trigger.

    Per quanto riguarda l'inserimento ho risolto,mi è bastato solamente mettere IGNORE nel comando insert (INSERT IGNORE INTO archivio_progetti ecc.).

    Oltre a gestire l'inserimento però devo gestire anche l'UPDATE. cioè,se la DATA_FI_PREV viene cambiata e ne viene messa una tale che DATA_FI_PREV > CURDATE () devo togliere il progetto da ARCHIVIO_PROGETTI. non riesco a gestire questa cosa! cioè devo confrontare le due tabelle dentro al trigger??come posso fare??

  4. #4
    ok perfetto ho risolto tutto

    posto il codice del trigger,magari può essere di aiuto a qualcun'altro

    DELIMITER |
    CREATE TRIGGER aggiorna_archiviati AFTER UPDATE ON progetto FOR EACH ROW
    BEGIN
    UPDATE archivio_progetti,progetto SET archivio_progetti.data_f_prev_a=progetto.data_f_pr ev WHERE progetto.data_f_prev != archivio_progetti.data_f_prev_a AND progetto.nome = archivio_progetti.nome_a;
    DELETE FROM archivio_progetti WHERE data_f_prev_a > CURDATE();
    END;
    |

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.