Meilleur moyen dans ASP.NET de configurer des lignes dans une database à supprimer après un certain time

Supposons que j'ai une table dans ma database comme

Registrants ======================================================================= id | name | email | registration_date ======================================================================= 1 | "Sam" | "[email protected]" | "2016-03-26T14:25:10" ----------------------------------------------------------------------- 2 | "Bob" | "[email protected]" | "2015-12-01T10:09:30" ----------------------------------------------------------------------- . | . | . | . ----------------------------------------------------------------------- . | . | . | . ----------------------------------------------------------------------- . | . | . | . ----------------------------------------------------------------------- . | . | . | . 

et je veux que chaque inscrit soit automatiquement supprimé, disons, 100 jours après son inscription. Quelle est la bonne façon de faire cela, et quelle est la meilleure façon?

La mauvaise façon que je prévoyais de le faire allait être de créer un sproc

 CREATE PROCEDURE FlushOldRegistrants AS BEGIN DELETE FROM Registrants WHERE DATEADD(day,100,registration_date) < GETDATE() END 

et dans mon code côté server invoquer ce sproc de time en time comme

 Script.SetInterval(delegate { using (var conn = new SqlConnection(connectionSsortingng)) using (var command = new SqlCommand("FlushOldRegistrants", conn) { CommandType = CommandType.StoredProcedure }) { conn.Open(); command.ExecuteNonQuery(); conn.Close(); } }, 60000); // flush old registrants every hour 

Mais, puis-je faire tout cela au niveau de la database? Est-il possible de créer un TRIGGER T-SQL qui fait cela? Ou y a-t-il un moyen encore meilleur?

La méthode la plus évidente consiste à utiliser SQL Server Agent . Configurez un travail qui s'exécute tous les jours ou une fois par semaine et appelez votre procédure stockée.

Une autre option consiste à laisser toutes datatables dans la table et à créer une vue:

 create view v_Registrants as select r.* from Registrants r where registration_date < DATEADD(day, -100, getdate()) ; 

Lorsque vous accédez aux données via la vue, vous ne verrez que datatables les plus récentes. Un avantage de cette approche est qu'elle est précise – vous n'obtiendrez jamais de données âgées de 102 jours ou 100 jours et de 8 heures – ce qui constitue un danger en utilisant un emploi planifié. En fait, si la coupure exacte est importante, vous pourriez vouloir cette vue aussi bien que le travail.

Dans les deux cas, vous êtes plus sûr d'utiliser cette instruction where , car elle peut utiliser des index (et devrait donc être plus rapide).

De telles opérations sont de bons candidats à exécuter en tant que tâches planifiées.

Maintenant, si vous voulez les exécuter à la fin de la database, vous pouvez opter pour les jobs SQL . Pour l'option non DB, il existe une variété de choix comme, Windows Task Scheduler , Windows service , des outils tiers comme Quartz ou Hanfgire etc.

Chacune des options a ses propres avantages et inconvénients. Considérez ce qui est le plus logique pour votre application.

Si vous souhaitez effectuer cette opération au niveau de la database SQL Jobs est une bonne option