2011-10-11 3 views
1

Je travaille sur un code existant qui effectue des mises à jour sur une ligne spécifique un champ à la fois. La façon dont l'historique fonctionne est que tous les champs sont écrits chaque fois qu'une mise à jour, insertion ou suppression se produit. Comment est-ce que j'élimine tout mais la dernière mise à jour dans un orderId spécifique, un petit intervalle de temps, et le même userid si après que le déclencheur ait fini une insertion dans ma table d'histoire?supprimer les mises à jour pour déclencher les mêmes champs

delete from tblHistory as h 
where h.OrderId in 
     (SELECT OrderId 
     from inserted 
     where datediff("s",myDate, getdate()) <= 5) 
       and exists (select b.* 
          FROM inserted as b 
          WHERE b.userId = h.userId and 
          b.OrderId = h.orderId) -- except last one 
                       -- within last 1 to 5 seconds 

Mon tblHistory a HistoryId comme clé primaire auto-incrémentée. Donc, je devrais avoir deux ou plusieurs HistoryIds mais seulement un OrderId et la date diff doit être dans au moins 5 secondes. Je veux m'assurer que mon historique ne déborde pas car nous n'avons qu'un espace limité pour suivre l'historique. Aussi, je ne veux que copier les données seulement si l'userId est le même.

+0

J'ai besoin de supprimer ceci où historyId est inférieur à l'historique le plus récent. – RetroCoder

+0

Le OrderId est également enregistré dans la table OrderHistory, mais OrderHistoryId est la fonctionnalité d'incrémentation automatique de cette table. – RetroCoder

+0

Je pense que j'ai compris, je peux le faire après que les mises à jour sont terminées, Après l'attente, je peux supprimer la ligne historique si elle est inférieure à OrderHistoryId d'une ligne historique existante et tous les critères ci-dessus correspondent également. thx – RetroCoder

Répondre

1

Je me demande pourquoi vous voulez supprimer ces enregistrements - et si vous devez le faire, je me demande pourquoi vous le faites dans le déclencheur. Je préfère une solution qui réduit les données quotidiennement. Mais si vous avez vraiment de le faire, cela pourrait fonctionner:

delete h 
from tblHistory h 
inner join inserted i 
    on i.OrderId = h.OrderId 
    and i.UserId = h.UserId 
where h.MyDate > dateadd("s",-5,getdate()) 
    and h.HistoryID < 
     (select max(h2.HistoryID) 
     from tblHistory h2 
     where h2.OrderId = i.OrderId); 

Je considère qu'il est possible d'insérer plus d'une ligne à la fois entraînant plus l'un enregistrement dans inséré. En fin de compte, il devrait supprimer max. un enregistrement par exécution. Vous pourriez avoir besoin d'index sur (OrderId, HistoryId) et (OrderId, UserId, MyDate) pour de bonnes performances.

HTH

+0

Je ne sais pas pourquoi j'aurais même écrit ça. Je devais être bourré ou essayer de trouver quelque chose pour un autre ingénieur logiciel ivre ou drogué. – RetroCoder

Questions connexes