Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    23

    [MYSQL] Trigger per impedire delete

    In MySql è possibile con un trigger impedire il delete di record che soddisfano una determinata condizione?

    In altre parole un trigger può interrompere l'esecuzione di un comando delete se un campo del record che sta per essere eliminato possiede un valore prefissato?

    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    117
    Ciao palmico
    Non so se è possibile però posso suggerirti un piccolo trucco per arrivare al risultato:
    Puoi creare una ulteriore tabella nella quale inserirari tante righe per quante sono quelle contenenti i valori che vuoi preservare legandole come chiave esterna all'id delle righe che hai ora.
    Quindi se si cercherà di cancellare una riga dalla tabella principale, esistendo un vincolo di chiave esterna, questo darà errore.
    Per ulteriore sicurezza potresti limitare i privilegi sulla nuova tabella.
    Spero di essere stato d'aiuto
    Ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    23
    Ti ringrazio moltissimo la tua soluzione ottiene esattamente il risultato che volevo, non nascondo che ci avevo pensato anche io ma mi è stato richiesto se è fattibile con i trigger e non riesco a capirlo da solo.

    In ogni caso sponsorizzerò la tua proposta, grazie ciao

  4. #4
    Io userei un trigger BEFORE DELETE FOR EACH ROW. Qui un esempio che mi ero salvato tempo fa per MySQL, visto che mi serviva:
    codice:
    DELIMITER $$
    
    CREATE TRIGGER nome_trigger
    BEFORE DELETE ON nome_tabella
    FOR EACH ROW
    BEGIN
    
      IF condizione THEN -- Will only abort deletion for specified IDs
        SIGNAL SQLSTATE '45000' -- "unhandled user-defined exception" (consigliato come da documentazione per errori custom)
          -- Here comes your custom error message that will be returned by MySQL
          SET MESSAGE_TEXT = 'This record is sacred! You are not allowed to remove it!!';
      END IF;
    
    END
    $$
    
    DELIMITER ;
    L'avevo provato su un mySql 5.5 (usa SIGNAL) , quindi non so se funziona su versioni precedenti.

    Ovviamente lo puoi personalizzare un po' come ti piace:
    - Aggiungendo ulteriori controlli
    - Inserendo una tabella di auditing

    Link utili:
    TRIGGER
    SQLSTATE

    abbiamo i trigger, usiamoli su...
    Ultima modifica di LuciferSam86; 03-12-2015 a 22:56

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    23
    Grazie LuciferSam86 non conoscevo SIGNAL ma è quello che cercavo.

    Ho visto che si può simulare signal su versioni precedenti mysql 5.5 chiamando una procedura inesistente: CALL raise_error;
    dove ovviamente raise_error non è mai stata definita.

Tag per questa discussione

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.