Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    [MySQL] Eliminazione/modificata a cascata

    Ho questa necessità: quando elimino un utente dal mio database, devo aggiornare tutti gli eventi cui ha partecipato sostituendo il nome dell'utente (che poi è anche la PK di utente) con una stringa tipo "anonimo".
    Tutti le foreign key che riferiscono l'utente hanno l'opzione "Cascade", quindi una semplice eliminazione dell'utente non va bene perché si propagherebbe sulle altre tabelle facendo sparire le righe relative.
    Se faccio prima l'update dell'utente sostituendo lo username con anonimo, poi non posso più ritrovare quell'utente.
    Mi serve un trigger o una procedura? Come potrei risolvere?
    Grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Questa è l'unica soluzione che mi è venuta in mente e non so nemmeno se funzionerebbe.
    Potrei cambiare l'opzione CASCADE in SET NULL per l'operazione ON DELETE sui campi che referenziano la tabella UTENTE. In questo modo potrei usare un trigger before delete che mi fa l'update di tutti i campi coinvolti con lo username nelle varie tabelle.
    Però come soluzione, ammesso che funzioni, non mi piace perché significa dover introdurre molti campi importanti che possono essere anche null. Certo poi tramite l'applicazione web potrei controllare che non vengano inseriti campi vuoti dove serve.
    Però boh...sono sicura che ci siano soluzioni migliori.

  3. #3
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,254
    Lo elimini logicamente.
    Aggiungi un attributo sull'utente che dice se è eliminato.
    Nell'aplicazione se questo flag è attivo non visualizzi l'utente.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Questa non è una soluzione, è un workaround Si tratta di un progetto per un esame per cui non posso usare stratagemmi per aggirare il problema.

  5. #5
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,254
    Allora la PK la cambi in un ID.
    Nelle FK elimini il Delete on cascade.

    Quando caricherai i dati dell'Ordine (ad esempio) metti in left outer join la tabella degli utenti per prendere il nome dell'utente, se è presente carica il nome dell'utente, se non è presente avrai NULL.
    NULL lo puoi gestire con un IF direttamente nella query (ma sarebbe meglio una gestione da programma)

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Vabbè in pratica stai dicendo quello che ho detto io, solo che la tua soluzione prevede anche l'aggiunta di un ulteriore attributo alla tabella Utente, cioè l'ID. Significa che devo modificare tutto il db.
    No, io penso che esista un modo migliore di farlo.
    Ah, se solo ci fosse il SET DEFAULT anche per INNODB avrei risolto in un attimo.

  7. #7
    Moderatore di Windows e software L'avatar di URANIO
    Registrato dal
    Dec 1999
    residenza
    Casalpusterlengo (LO)
    Messaggi
    1,254
    In generale non è mai una buona scelta mettere il nome utente come chiave per molte ragioni.
    Ci sono molti modi di fare quello che chiedi, più o meno giusti, tutto dipende da cosa vuole "insegnare" l'esame e da cosa ti hanno spiegato.
    SICURAMENTE l'idea di fare un update per mettere anonimo sulle tabelle non è un idea valida.

  8. #8
    se devi anonimizzare e non metti anonimo come nome utente NON stai anonimizzando. stessa cosa se usiun ID di relazione e cancelli l'utente solo logicamente. se ho capito bene quello che devi fare.

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