2010-03-03 3 views
0

J'ai une table, tblClient, qui stockait la date de naissance d'un client dans un champ de type datetime, DOB.Surveillance d'une donnée calculée (l'âge d'une personne) dans SQL Server

L'objectif est que, lorsqu'un client atteint l'âge de 65 ans (doit être calculé par DOB), j'ai besoin d'insérer un nouvel enregistrement dans une autre table.

Mais puisque l'âge d'un client ne change pas en raison d'une transaction de base de données (INSERT, UPDATE, DELETE), le déclencheur est hors de question.

Quelle serait une bonne idée de surveiller de tels changements?

+0

un travail planifié périodiquement (proc stocké par exemple) qui effectue la vérification et prend les mesures appropriées. –

+0

@mjv: Le commentaire de Mitch est apparu juste avant que j'aie posté le mien. Laissez-moi m'en débarrasser. – Sung

Répondre

2

créer un emploi d'agent sql qui fonctionne tous les jours ou toutes les heures qui fera ce calcul avec T-SQL et si quelqu'un atteint 65 il fera l'insert

1

Un plan de gestion des tâches ou SQL planifiée Server qui exécute un stocké procédure aussi souvent que nécessaire, mise à jour des lignes requises.

1

Qu'en est-il d'un travail nocturne utilisant SSIS avec une procédure stockée qui vérifie et s'il arrive qu'ils ont 65, il entre une nouvelle ligne dans la table?

+2

Pourquoi SSIS lorsque vous pouvez utiliser T-SQL à partir d'un travail d'agent SQL? – SQLMenace

+0

@SQLMenace - Y a-t-il une différence entre le service de planification que vous utilisez? – DVK

+0

si vous utilisez SSIS maintenant, vous devez également déployer le paquet et pour autant que nous sachions, il n'utilise même pas SSIS – SQLMenace

2

Gardez-le aussi autonome que possible sur SQL Server - un travail SQL Server Agent qui exécute périodiquement une procédure stockée devrait être très agréable.

1

vous pouvez créer un Agent SQL Server au sein de la base de données en utilisant SQL Server Management Studio pour cela:

http://www.databasedesign-resource.com/sql-server-jobs.html

Mettre en place un travail quotidien pour ou tout ce que vous voulez nommer.

Tant que la base de données est en cours d'exécution, le travail s'exécutera selon la planification que vous avez définie (à partir de la base de données).

1

Je vais proposer une autre approche - exécuter quelque chose chaque fois qu'une base de données est mise à jour (ou ajoutée) qui calcule la période à partir de maintenant jusqu'à ce que la première personne atteigne 65. Puis (re) planifier un travail à exécuter temps.

En outre, je ne peux pas croire que vous ayez besoin d'insérer cette ligne à la seconde où ils atteignent 65, alors une procédure quotidienne qui calcule les nouveaux 65 ans serait assez bonne?

+0

Exécution quotidienne des sons assez raisonnable maintenant je pense à ce sujet ... merci Paul, – Sung

1

Que diriez-vous d'un nouveau champ qui date de 65 ans. Calculez-le une fois sur l'insertion d'enregistrement, alors vous pouvez interroger le contenu de votre cœur sur ce champ. Vous aurez besoin de faire ceci est un déclencheur (et compte pour les mises à jour, ils sont rares pour les champs DOB mais possible quand ils sont mal orthographiés.) Maintenant que j'y pense, un fichier calculé fonctionnera probablement au lieu d'un déclencheur.

Ensuite, exécutez un travail quotidien pour capturer tous ceux qui ont eu 65 ans depuis la dernière exécution du travail. Assurez-vous de gérer cela de sorte que si le travail échoue un jour, les personnes de cette date sont prises en charge la prochaine fois.

La raison pour laquelle je suggère ceci est que le calcul de l'âge de chaque personne dans votre base de données tous les jours est un tel gaspillage de ressources pour un calcul qui n'a vraiment besoin d'être fait qu'une seule fois. Ok pas un gros problème quand vous avez 100 personnes, gros problème quand vous avez un million. Doindthis kindof calc sur un million de dossiers pour identifier les trois dont vous avez besoin est douloureux. Le faire une fois sur la saisie des données, pas si mal.

+0

Je ne suis pas sûr de voir la différence entre calculer une date il y a 65 ans à partir d'aujourd'hui une fois par jour/nuit, puis interroger toute date de naissance égale à cette date ou votre suggestion de: age65date = getdate()? Indexation DOB d'autant mieux. – JeffO

+0

la differnce est entre effectuer un calcul une fois sur insert et le faire tous les jours (quand le thedate la personne qui aura 65 ans n'est pas un nombre changeant en general) surtout sur un grand ensemble de donnees. Il n'est pas efficace de répéter de tels calculs quand ils ne sont pas nécessaires. Pourquoi gaspiller des ressources de serveur faisant le même travail encore et encore chaque jour? – HLGEM

Questions connexes