2009-09-09 9 views
1

J'applique CRUD sur mon application Silverlight, mais je ne veux pas implémenter la fonctionnalité Delete de la manière traditionnelle, mais je voudrais plutôt que les données soient cachées dans la base de données.Base de données SQL Server - Champs masqués?

Est-ce que quelqu'un sait d'une façon de faire cela avec une base de données SQL Server?

Aide grandement appréciée.

+1

Udi Dahan avait un très bon article de blog à ce sujet. http://www.udidahan.com/2009/09/01/dont-delete-just-dont/ –

Répondre

2

Extension de l'idée de Lukasz, une colonne datetime est également utile.

  • NULL = courant
  • Valeur = lorsque douce supprimé

Cela ajoute simplement versioning qu'une colonne de bits ne peut pas, qui peut mieux fonctionner

+0

+1: la colonne de date serait une sorte de champ * audit * ** DeletedAt ** dans ce cas. on pourrait vouloir tracer le ** DeletedBy ** en plus de cela. – van

9

Vous pouvez ajouter une colonne à la table « supprimé » qui a une valeur 0 ou 1, et afficher uniquement les enregistrements avec deleted = 0.

ALTER TABLE TheTable ADD COLUMN deleted BIT NOT NULL DEFAULT 0 

Vous pouvez également créer des lignes de vue qui prend seulement non supprimés.

CREATE VIEW undeleted AS SELECT * FROM TheTable WHERE deleted = 0 

Et vous supprimez la commande ressemblerait à ceci:

UPDATE TheTable SET deleted = 1 WHERE id = ... 
+0

meilleure façon de le faire à partir de ce que j'ai vu. – DForck42

-1

Soyez prudent avec ce genre de mise en œuvre, car les suppressions douces briser l'intégrité référentielle et vous devez respecter l'intégrité dans vos entités en utilisant une logique personnalisée.

+0

Comment cela brise-t-il l'intégrité référentielle? Rien n'est "manquant" ... – AnonJr

+2

Je pense qu'il veut dire qu'il ne rompt pas l'intégrité référentielle. Par conséquent, si vous supprimez logiquement quelque chose, cela ne vous obligera pas à supprimer logiquement les données associées. –

+0

Néanmoins, dans une requête correctement configurée, cela ne fera pas de différence. D'autant plus que le PO cherche clairement à conserver les données. – AnonJr

0

Vous pouvez faire Lukasz Lysik suggests, et avoir un champ qui sert de drapeau pour les lignes "supprimées", en les filtrant quand vous ne voulez pas qu'elles apparaissent. J'ai utilisé cela dans un certain nombre d'applications.

Une suggestion alternative serait d'ajouter une attribution d'état supplémentaire s'il existe un code d'état préexistant. Par exemple, dans une application de présence en classe, nous utilisons en interne un enregistrement de présence "Importé", "Enregistré", "Complété", "Incomplet", etc. * - nous avons ajouté une option "Supprimé" pour les doublons non intentionnels . De cette façon, nous avons un record et nous ne sommes pas juste jeter une nouvelle colonne sur le problème.

* C'est le nom d'affichage d'un code numérique utilisé derrière les scènes. Juste clarifier. :)

2

Dans la plupart des cas je préférerais archiver les supprimer lignes à une table d'archivage avec un déclencheur de suppression. De cette façon, je peux également capturer qui a supprimé chaque ligne et les lignes supprimées n'ont pas d'impact sur mes performances. Vous pouvez ensuite créer une vue qui regroupe les deux tables lorsque vous souhaitez inclure les tables supprimées.

0

Solution avec des déclencheurs

Si vous êtes amis avec déclencheur DB, alors vous pouvez envisager:

  • ajouter une DeletedAt and DeletedBy colonnes à vos tables
  • créer une vue pour chaque table (ex : pour la table Customer avoir une vue CustomerView, ce qui permettrait de filtrer les lignes qui ont DeletedAt non nul (idée de gbn avec des colonnes de date)
  • toutes vos opérations CRUD fonctionnent comme d'habitude, mais pas sur la table Customer, mais sur la CustomerView
  • ajouter INSTEAD OF DELETE déclencheur qui marquerait la ligne comme supprimer au lieu de supprimer physiquement.
    • vous voudrez peut-être faire un peu des choses plus complexes là comme faire en sorte que toutes les références FK à cette ligne sont « logiquement » supprimés afin d'avoir encore logiqueintégrité référentielle

Si vous choisissez d'utiliser ce modèle, je nommerais probablement mes tables différemment comme TCustomer, et les vues juste Customer pour la clarté du code client.

+0

vous pouvez vouloir Google pour "SQL logique supprimer" ainsi – van

Questions connexes