2010-11-04 4 views
2

J'ai une configuration de table d'audit qui reflète essentiellement l'une de mes tables avec une date, un utilisateur et un type de commande. Voilà comment cela pourrait ressembler à:Suppression périodique des lignes dans TSQL

AuditID  UserID Individual modtype user audit_performed 
1   1239  Day Meff  INSERT dbo 2010-11-04 14:50:56.357 
2   2334  Dasdf fdlla INSERT dbo 2010-11-04 14:51:07.980 
3   3324  Dasdf fdla DELETE dbo 2010-11-04 14:51:11.130 
4   5009  Day Meffasdf UPDATE dbo 2010-11-04 14:51:12.777 

Étant donné que ces types de tables peuvent obtenir grande assez rapide - je pensais à mettre dans une sorte de suppression automatique des lignes anciennes. Donc par exemple si j'ai 3 mois d'histoire - si je pouvais effacer le premier mois tout en conservant les deux derniers. Et encore une fois tout cela doit être automatique - j'imagine qu'une fois qu'une certaine date est atteinte, une requête active et supprime le mois le plus ancien avec des données d'audit. Quelle est la meilleure façon de procéder? J'utilise SQL Server 2005 en passant.?

+0

J'éviterais de créer un déclencheur sur l'audit pour supprimer les anciennes entrées. Cela vous donnera seulement un billet de première classe dans un monde de douleur - surtout si vous créez l'entrée d'audit en utilisant un déclencheur en premier lieu. La meilleure option consisterait à planifier un travail d'agent SQL quotidien à un moment où il n'y aura pas ou peu d'activité dans la table d'audit. Oh et à un moment qui n'interfère pas avec vos plans de sauvegarde et de maintenance. – codingbadger

Répondre

4

Vous pouvez utiliser SQL Server agent ..vous pouvez planifier un travail répétitif comme la suppression d'entrées de la table d'audit en cours après certaines périodes. Here est comment vous le feriez.

Je vous recommande de stocker les données dans une autre table table audit_archive et de les supprimer de la table d'audit actuelle. Donc, au cas où vous voulez un peu d'histoire vous l'avez toujours et votre table ne devient pas trop grande.

3

Vous pouvez essayer un déclencheur à chaque fois qu'une ligne est ajoutée, cela effacera tout ce qui date de plus de 3 mois.

Vous pouvez également essayer SQL Agent pour exécuter un script tous les jours qui fera cela.

+1

+1 pour un travail d'agent SQL. Je voudrais absolument rester loin d'un déclencheur pour cela (mais je ne vais pas donner -1 pour cela :). –

+0

En effet, le déclencheur déclencherait probablement trop souvent. Une autre option consisterait à utiliser un programme externe pour exécuter la requête. Peut-être déclenché à partir de Windows Task Scheduler. Tout dépend de vos droits d'accès au serveur. – drew

0

Avez-vous envisagé d'utiliser des déclencheurs? Vous pouvez définir un déclencheur à exécuter lorsque vous ajoutez une ligne (sur INSERT) qui supprime toutes les lignes datant de plus de trois mois.

+0

Vous pourriez/pourriez ajouter BEAUCOUP d'overhead à chaque insert si vous deviez le faire avec des triggers. –

+0

Une idée dangereuse. Les déclencheurs sont très désagréables à déboguer et peuvent faire des ravages s'ils ne sont pas gardés. – dotariel

5

Un travail d'agent SQL devrait être bon ici. Vous n'avez certainement pas besoin de le faire sur chaque insert avec un trigger. Je doute que vous ayez même besoin de le faire tous les jours. Vous pouvez planifier un travail qui s'exécute une fois par mois et efface tout ce qui date de plus de deux mois (donc, au maximum, vous aurez trois mois de données moins un jour à la fois).

Questions connexes