Exécuter la procédure stockée à partir d'un Déclencheur après un temps de retard
Je veux appeler une procédure stockée à partir d'un déclencheur,
comment exécuter cette procédure stockée après x minutes?
Je suis à la recherche de quelque chose d'autre que WAITFOR DELAY
grâce
Vous devez vous connecter pour publier un commentaire.
Ont une tâche de l'Agent SQL qui fonctionne régulièrement et tire paramètres de procédure stockée à partir d'une table - les lignes doivent indiquer également, lors de leur exécution de la procédure stockée doit se produire, de sorte que la tâche de l'Agent SQL doit choisir les lignes qui sont en raison de/un peu de retard. Il faut supprimer les lignes ou les marquer après l'appel de la procédure stockée.
Puis, dans le déclencher, il suffit d'insérer une nouvelle ligne dans cette même table.
Vous ne pas veux mettre quoi que ce soit dans un déclencheur qui va influer sur l'exécution de la transaction initiale, en aucun cas, vous ne voulez certainement pas être à l'origine des retards, ou d'interagir avec quoi que ce soit à l'extérieur de la même base de données.
E. g., si la procédure stockée est
Alors nous devrions créer un tableau:
Et la tâche de l'Agent SQL ferait:
Et le déclencheur aurait juste:
Si vous êtes en cours d'exécution dans une édition qui ne prend pas en charge de l'agent, alors vous pourriez avoir à faire semblant. Ce que j'ai fait dans le passé est de créer une procédure stockée qui contient les "pauvres mans les travaux de l'agent", quelque chose comme:
Ensuite, créez une seconde procédure stockée, cette fois dans le
master
base de données, qui attend 30 secondes, puis appelle la première procédure:Et puis, marquer cette procédure comme une procédure de démarrage, à l'aide de
sp_procoption
:Et redémarrez le service que vous aurez maintenant une permanence de l'exécution de la requête.
J'ai eu une situation similaire où avant j'ai traité les enregistrements insérés dans la table avec la gâchette, je voulais m'assurer que tous les éléments pertinents liés des données dans des tables relationnelles, était également là.
Ma solution a été de créer un scratch de la table qui a été peuplée par le déclencheur d'insertion sur la première table.
Scratch table avait une mise à jour du drapeau, (par défaut à 0), et un insert
get date()
champ de la date et de l'identifiant de la table principale.Ensuite, j'ai créé un processus planifié à boucle sur le zéro de la table et d'effectuer quelque procédé que ce soit, je voulais effectuer sur chaque dossier individuellement, et mise à jour du "jour du drapeau" comme chaque enregistrement a été traitée.
MAIS, c'est là que j'ai été un tout petit peu intelligent, dans la boucle sur les processus de recherche d'enregistrements dans le scratch de table qui a eu une
update flag = 0
, j'ai aussi ajouté leAND
clause deAND datediff(mi, Updated_Date, getdate())> 5
. De sorte que le dossier ne serait pas en fait être traitées jusqu'à 5 minutes APRÈS il a été inséré dans le scratch de la table.