Abbiamo visto che è possibile mettere in relazione una Entità A con un'altra Entità B aggiungendo all'Entità A un Campo di tipo riferimento che richiama l'Entità B (A → B). Se l'Entità B viene eliminata, quel Campo si svuota e l'Entità A, pur continuando ad esistere, perde una delle sue informazioni. Ad esempio, nella app "Prestiti tra Vicini" la Richiesta ha un Campo riferimento di nome "Oggetto" in cui si richiama l'Oggetto chiesto in prestito: se l'Oggetto richiesto viene eliminato, si perde l'informazione su cosa è stato chiesto.
Per impedire questa situazione, nei Ruoli e Permessi possiamo negare a tutti i Ruoli il Permesso di eliminare gli Oggetti. Questa soluzione può risultare eccessivamente vincolante, perché impedisce di eliminare Oggetti inseriti erroneamente nella app.
In realtà, quel che vorremmo realmente impedire è l'eliminazione di una Entità solo se è già stata richiamata da un'altra Entità. A questo scopo possiamo installare ed attivare il modulo aggiuntivo Entity Reference Integrity. che aggiunge in Configurazione - Entity Reference Integrity la possibilità di proteggere i Contenuti dall'eliminazione se già richiamati da altre Entità. Attivata questa protezione, se un Utente tenta di eliminare un Contenuto (ad esempio un Oggetto) richiamato da altri Contenuti (es. in una Richiesta) l'operazione viene bloccata e viene mostrato all'Utente l'elenco dei Contenuti (Richieste) che lo richiamano. Questo metodo è molto robusto, perché incarica Drupal di impedire ogni eliminazione che distrugga relazioni tra Contenuti. Di contro, è un metodo rigido, perché:
- si applica a tutti i Contenuti, indipendentemente dal tipo di Contenuto e dal Ruolo dell'Utente
- l'eliminazione di un Contenuto può richiedere una lunga sequenza di eliminazioni, magari a cura di Utenti diversi
- può portare a situazioni di stallo, in caso di catene circolari di richiami tra Entità, es. A → B → C → A.
Una soluzione più flessibile consiste nell'aggiungere agli Oggetti un Campo "Attivo" di tipo booleano o selezione, con valori possibili "Si" e "No" e default "Si": invece che eliminare un Oggetto, mettiamo il suo Campo "Attivo" a "No" e, nella creazione o modifica di una Richiesta, escludiamo con un apposito filtro la possibilità di selezionare gli Oggetti con Attivo = "No" nella compilazione del Campo "Oggetto".