Comment implémenter soft delete dans SQL sur des données avec des relations de key étrangère?

J'ai besoin de changer le comportement de la fonction "delete" sur une application web sur une table qui a 5 relations de key étrangère. Il s'agit d'une application Web de très grande taille. Je suis donc à la search du changement d'impact le less risqué et le less susceptible de nécessiter le minimum de modifications de l'application Web.

Je peux penser à deux options:

  1. append une colonne à la table deleted avec la valeur par défaut 0 et 1 indiquera que l'logging a été supprimé. Cela nécessitera la mise à jour de toutes les sélections de la table (ainsi que de ses tables enfant, car elles sont maintenant orphelines) pour inclure la clause where deleted = 0 . L'application Web est ancienne et n'est pas bien écrite (code répété). Il y a donc beaucoup d'endroits qui nécessiteront ce changement, il est donc risqué de manquer un ou plusieurs locations.

  2. Déplacez l'logging vers une autre copy de la table, en particulier pour les loggings supprimés. J'aurais probablement besoin de refléter chaque table d'enfant aussi bien.

Option 1 semble être plus d'effort à l'avant, mais plus maintenable à l'avenir, l'option 2 n'est pas beaucoup de travail à l'avant, des changements minimes à l'application web, mais très salissant. Y a-t-il d'autres options?

Ceci est un excellent exemple de pourquoi je suis si friand de points de vue.

  • Créer la nouvelle colonne, Supprimé
  • Renommez la table: MyData => AllMyData
  • Créez une vue avec l'ancien nom qui expose datatables de la table exactement de la même manière que précédemment, mais uniquement pour les lignes "non supprimées".

Exemple:

 create view MyData as select ... from AllMyData where Deleted = 0 
  • Écrire des triggersurs sur la vue pour gérer DML comme s'il s'agissait de la table d'origine.

  • Créez une autre vue pour exposer les lignes supprimées.

Exemple:

 create view DeletedMyData as select ... from AllMyData where Deleted = 1 
  • Mettre en œuvre une fonctionnalité "soft delete" et "undelete" dans l'application. Ce code sera le seul code accédant directement à la table, définissant la valeur de Deleted à 0 ou 1 selon le cas. Le code existant n'aura besoin d'aucune modification.

  • Les tables enfants ne nécessiteront probablement aucun changement. Comme ils sont probablement interrogés en se joignant à la vue non annulée (celle avec le nom de la table d'origine), les loggings faisant reference à des données "supprimées" ne seront pas exposés mais seront réexposés automatiquement lorsque datatables seront restaurées.