Database di SQL Server: campi nascosti?
-
05-07-2019 - |
Domanda
Sto implementando CRUD sulla mia applicazione silverlight, tuttavia non voglio implementare la funzionalità Elimina in modo tradizionale, invece vorrei impostare i dati da nascondere invece all'interno del database.
Qualcuno conosce un modo per farlo con un database SQL Server?
Aiuto molto apprezzato.
Soluzione
Estendendo l'idea di Lukasz, è utile anche una colonna datetime.
- NULL = corrente
- Valore = quando cancellato soft
Questo aggiunge un semplice controllo delle versioni che una colonna di bit non può non funzionare meglio
Altri suggerimenti
Puoi aggiungere un'altra colonna alla tabella " cancellata " che ha valore 0 o 1 e visualizza solo i record con eliminato = 0.
ALTER TABLE TheTable ADD COLUMN deleted BIT NOT NULL DEFAULT 0
Puoi anche creare una vista che accetta solo righe non cancellate.
CREATE VIEW undeleted AS SELECT * FROM TheTable WHERE deleted = 0
E il comando di eliminazione sarebbe simile al seguente:
UPDATE TheTable SET deleted = 1 WHERE id = ...
Nella maggior parte dei casi preferirei archiviare le righe eliminate su una tabella di archivio con un trigger di eliminazione. In questo modo posso anche catturare chi ha eliminato ogni riga e le righe eliminate non influiscono sulle mie prestazioni. È quindi possibile creare una vista che unisca entrambe le tabelle quando si desidera includere quelle eliminate.
Potresti fare come Lukasz Lysik suggerisce , e avere un campo che funge da flag per " cancellato " righe, filtrandole quando non vuoi che vengano visualizzate. L'ho usato in diverse applicazioni.
Un suggerimento alternativo sarebbe quello di aggiungere un'assegnazione di stato extra se esiste un codice di stato preesistente. Ad esempio, in un'app di presenza in classe che utilizziamo internamente un record di presenza potrebbe essere "Importato", "Registrato", "Completato", "Completato", "ecc." - Abbiamo aggiunto un "Eliminato"; opzione per i periodi in cui ci sono duplicati involontari. In questo modo abbiamo un record e non stiamo semplicemente lanciando una nuova colonna al problema.
* Questo è il nome visualizzato per un codice numerico usato dietro le quinte. Sto solo chiarendo. :)
Soluzione con trigger
Se sei amico del trigger DB, potresti considerare:
- aggiungi una
colonne DeletedAt e DeletedBy
alle tue tabelle - crea una vista per ogni tabella (es: per la tabella
Customer
ha una vistaCustomerView
, che filtrerebbe le righe che hannoDeletedAt
non null (idea di gbn con colonne di date) - tutte le operazioni CRUD vengono eseguite normalmente, ma non nella tabella
Customer
, ma inCustomerView
- aggiungi
INSTEAD OF DELETE
che dovrebbe contrassegnare la riga come elimina invece di eliminarla fisicamente.- potresti voler fare cose un po 'più complesse come garantire che tutti i riferimenti FK a questa riga siano anche "logicamente" eliminato per avere ancora logico integrità referenziale
Se scegli di utilizzare questo modello, probabilmente denominerei le mie tabelle in modo diverso come TCustomer,
e visualizzo solo Customer
per chiarezza del codice client.
Fai attenzione a questo tipo di implementazione perché le eliminazioni automatiche interrompono l'integrità referenziale e devi imporre l'integrità nelle tue entità usando la logica personalizzata.