Question

J'implémente CRUD sur mon application silverlight, mais je ne souhaite pas implémenter la fonctionnalité de suppression de manière traditionnelle, mais j'aimerais plutôt que les données soient masquées dans la base de données.

Quelqu'un sait-il comment procéder avec une base de données SQL Server?

Une aide grandement appréciée.

Était-ce utile?

La solution

En prolongeant l’idée de Lukasz, une colonne datetime est également utile.

  • NULL = actuel
  • Valeur = lorsque le logiciel est supprimé

Ceci ajoute un simple contrôle de version qu’une colonne de bits ne peut pas fonctionner mieux

Autres conseils

Vous pouvez ajouter une autre colonne à la table "supprimé". qui a la valeur 0 ou 1 et n'affiche que les enregistrements avec supprimé = 0.

ALTER TABLE TheTable ADD COLUMN deleted BIT NOT NULL DEFAULT 0

Vous pouvez également créer une vue qui prend uniquement des lignes non supprimées.

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

Et votre commande de suppression ressemblerait à ceci:

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

Dans la plupart des cas, je préférerais archiver les lignes supprimées dans une table d'archivage dotée d'un déclencheur de suppression. De cette façon, je peux également déterminer qui a supprimé chaque ligne et les lignes supprimées n’ont aucune incidence sur mes performances. Vous pouvez ensuite créer une vue qui unit les deux tables lorsque vous souhaitez inclure celles supprimées.

Vous pouvez faire comme Lukasz Lysik suggère , et avoir un champ qui sert d'indicateur pour " supprimé " rangées, en les filtrant lorsque vous ne voulez pas qu'elles apparaissent. Je l'ai utilisé dans un certain nombre d'applications.

Une autre suggestion 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 qui pourrait être "Importé", "Enregistré", "Complété", "Incomplet", etc. * - nous avons ajouté un "Supprimé". option pour les moments où il y a des doublons non intentionnels. De cette façon, nous avons un disque et nous ne faisons pas que jeter une nouvelle colonne sur le problème.

* C'est le nom d'affichage d'un code numérique utilisé dans les coulisses. Juste clarifier. :)

Solution avec déclencheurs

Si vous êtes ami avec DB trigger, vous pouvez envisager:

  • ajoutez des colonnes DeletedAt et DeletedBy à vos tables
  • crée une vue pour chaque table (par exemple: pour la table Client a une vue CustomerView , qui filtrerait les lignes contenant DeletedAt null (idée de gbn avec les colonnes de date)
  • toutes vos opérations CRUD fonctionnent normalement, mais pas sur la table Client , mais sur CustomerView
  • add INSTEAD OF DELETE déclencheur qui marquerait la ligne comme étant supprimée au lieu de la supprimer physiquement.
    • vous voudrez peut-être faire des choses un peu plus complexes, comme par exemple vous assurer que toutes les références FK à cette ligne sont également "logiquement". supprimé afin d'avoir toujours logique intégrité référentielle

Si vous choisissez d'utiliser ce modèle, je nommerais probablement mes tables différemment, comme TCustomer, et affichait simplement Client pour clarifier le code client.

Soyez prudent avec ce type d'implémentation, car les suppressions logicielles suppriment l'intégrité référentielle et vous devez appliquer l'intégrité dans vos entités à l'aide d'une logique personnalisée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top