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.

È stato utile?

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 vista CustomerView , che filtrerebbe le righe che hanno DeletedAt non null (idea di gbn con colonne di date)
  • tutte le operazioni CRUD vengono eseguite normalmente, ma non nella tabella Customer , ma in CustomerView
  • 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top