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

    Stored Procedure o Trigger?

    Ciao, lavoro su un database mysql con phpmyadmin.
    Ho una tabella dove tra i vari dati ho 3 colonne così nominate:
    1) Casa
    2) InizioPossesso
    3)FinePossesso

    Ho la necessità che ogni volta che viene cancellata una riga in questa tabella tramite il comando DELETE, il motore del database controlli qual'è la riga che ha lo stesso valore di casa della riga cancellata con la data di FinePosseso più alta e ponga a NULL questo valore.

    Esempio:
    Riga 1 - Casa: 1 - InizioPossesso: 10/03/2021 - Fine Possesso: Null -
    Riga 2 - Casa: 1 - InizioPossesso: 05/01/2021 - Fine Possesso: 10/03/2021 -
    Riga 3 - Casa: 1 - InizioPossesso: 30/09/2020 - Fine Possesso: 05/01/2021 -
    Riga 4 - Casa: 2 - InizioPossesso: 05/07/2020 - Fine Possesso: Null -
    Riga 5 - Casa: 2 - InizioPossesso: 02/02/2020 - Fine Possesso: 05/07/2020 -

    Se io lancio la delete sulla riga 1 il sistema deve prendere la riga 2 e settare a null FinePossesso (perchè la riga 2 ha il valore più alto di FinePossesso relativo alla casa 1).

    Cosa usereste? Una Stored Procedure o un Trigger? Come lo scrivereste? Io mi sto avventurando per la prima volta in questa strada

  2. #2

  3. #3
    ok ho capito, come immaginavo serve un trigger.... io vorrei che appena viene cancellata una riga venisse eseguita questa query:

    codice:
    UPDATE casacittadino SET dataInizioPossesso = null WHERE casa = old.casa AND dataInizioPossesso = (SELECT MAX(dataInizioPossesso) FROM casacittadino WHERE casa = old.casa)
    La sintassi sul sito che mi hai linkato ho visto essere così:

    CREATE TRIGGER nometrigger
    AFTER DELETE ON nomeTabella FOR EACH ROW
    UPDATE nomeCampo
    SET operazionedimodifca;

    Però questo interviene su tutte le righe... cosa che non voglio. Come dovrei impostarlo secondo te?

    Grazie

  4. #4

  5. #5
    Non se ne esce facilmente da questa cosa... come sempre mysql è piuttosto contorto. Ho cercato di documentarmi su come funzionano i trigger e ho scritto questa cosa:

    codice:
    CREATE TRIGGER `casaVecchioProprietario` 
    AFTER DELETE ON `casacittadino` 
    FOR EACH ROW 
    BEGIN    
    IF NOT EXISTS (SELECT * FROM casacittadino WHERE casa = old.casa AND dataFinePossesso is Null)
        THEN
            UPDATE casacittadino AS cc 
            INNER JOIN 
            (SELECT casa, max(dataInizioPossesso) mdip FROM casacittadino WHERE casa = old.casa GROUP BY casa) cc1 
            ON cc.casa = cc1.casa AND cc.dataInizioPossesso = cc1.mdip 
            SET dataFinePossesso = null;
        END IF;
    END
    Però quando deve girare il trigger mi da questo errore:

    Can't update table 'casacittadino' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

    Quindi sembra che non posso lavorare direttamente sulla tabella che invoca il Trigger? Vi risulta che sia giusta questa cosa? Perchè in tal caso si perde molta della potenza di questa funzione....
    Ultima modifica di Legolas84; 24-03-2021 a 14:30

  6. #6
    mi sa che devo rinunciare a fare tutto via db ma dovrò usare php per risolvere il problema

  7. #7
    non capisco la JOIN quando devi solo settare una data a NULL

  8. #8
    E' l'unico modo funzionante che ho trovato per dire al motore del DB di settare a null la data di fine possesso per la riga con la data di inizio possesso più alta.

    Comunque non è quello il problema, dall'errore sembra che non gli piaccia il fatto che io voglio aggiornare la stessa tabella che ha invocato il trigger.... e mi pare molto strano perchè in questo modo perde molta della sua utilità....

    Ora mi sto aggiustando e sto implementando la cosa in php (secondo me perdendo in prestazioni), ma mi piacerebbe spaccare il capello in 4 e capire effettivamente come funzionano questi meccanismi....

  9. #9
    visto che il tuo trigger è abbastanza complesso, prova a invocare una SP passando il parametro che ti serve. guarda qui https://www.mysqltutorial.org/mysql-...-from-trigger/

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 © 2021 vBulletin Solutions, Inc. All rights reserved.