Si un utilisateur insère des lignes dans une table, j'aimerais que SQL Server effectue un traitement supplémentaire - mais pas dans le contexte de la transaction de l'utilisateur.
par exemple L'utilisateur donne accès en lecture à un dossier:
UPDATE Dossiers SET AccesLecture = 1
WHERE IDdossier = 7
Autant que l'utilisateur est concerné, je veux que ce soit la fin de l'opération atomique. En réalité, je dois maintenant trouver tous les fichiers et dossiers enfants et leur donner AccesLecture
.
EXECUTER SynchroniserPermissions
C'est une opération potentiellement longue (plus de 2s). je veux que cette opération longue se produise "plus tard". Elle peut se produire 0 secondes plus tard, et avant que l'unité de carbone n'ait la chance d'y penser, la mise à jour asynchrone est terminée.
Comment puis-je exécuter cette opération requise de manière asynchrone lorsque c'est nécessaire (c'est-à-dire déclenché)?
L'idéal serait:
CREATE TRIGGER dbo.Dossiers POUR INSERT, UPDATE, DELETE COMME
EXECUTERASYNCHRONEMENT SynchroniserPermissions
ou
CREATE TRIGGER dbo.Dossiers POUR INSERT, UPDATE, DELETE COMME
EXECUTER SynchroniserPermissions AVEC(ASYNC)
Actuellement cela se produit comme un déclencheur:
CREATE TRIGGER dbo.Dossiers POUR INSERT, UPDATE, DELETE COMME
EXECUTER SynchroniserPermissions
et l'utilisateur est obligé d'attendre les 3 secondes chaque fois qu'il apporte une modification à la table Dossiers
.
J'ai pensé à créer une Tâche planifiée sur l'utilisateur, qui s'exécute toutes les minutes, et à vérifier un indicateur BesoindesautorisationsSynchronisation
:
CREATE TRIGGER dbo.Dossiers POUR INSERT, UPDATE, DELETE COMME
UPDATE ÉtatSystème SET BesoindesautorisationsSynchronisation = 1
Le binaire de la tâche planifiée peut vérifier cet indicateur, s'exécuter si l'indicateur est activé:
DÉCLARER @ValeurIndicateur int
SET @ValeurIndicateur = 0;
UPDATE ÉtatSystème SET @ValeurIndicateur = BesoindesautorisationsSynchronisation+1
WHERE BesoindesautorisationsSynchronisation = 1
SI @ValeurIndicateur = 2
DEBUT
EXECUTER SynchroniserPermissions
UPDATE ÉtatSystème SET BesoindesautorisationsSynchronisation = 0
WHERE BesoindesautorisationsSynchronisation = 2
FIN
Le problème avec une tâche planifiée est: - elle ne peut fonctionner plus vite que toutes les 60 secondes - elle souffre d'être une solution de polling - elle nécessite un exécutable
Ce que je préférerais, c'est un moyen pour que SQL Server puisse déclencher la tâche planifiée:
CREATE TRIGGER dbo.Dossiers POUR INSERT, UPDATE, DELETE COMME
EXECUTER SynchroniserPermissionsAsychronement
CREATE PROCEDURE dbo.SynchroniserPermissionsAsychronement COMME
EXECUTER sp_ms_StartWindowsScheduledTask @taskName="SynchronousPermissions"
Le problème avec cela est: - il n'existe pas de procédure stockée système sp_ms_StartWinodowsScheduledTask
Donc je cherche des idées pour de meilleures solutions.
Mise à jour: L'exemple précédent est un problème qui n'a aucune bonne solution depuis cinq ans maintenant. Un problème datant de 3 ans, qui n'a pas de bonne solution est une table que je dois mettre à jour une colonne de métadonnées après une insertion/modification. Le calcul des métadonnées prend trop de temps dans le traitement en ligne, mais cela ne me dérange pas qu'il apparaisse 3 ou 5 secondes plus tard:
CREATE TRIGGER dbo.UpdateValeursTransfertFonds POUR INSERT, UPDATE AS
UPDATE TransfertsFonds
SET ValeurCommandeTotale = (SELECT ....[snip]....),
ValeurDépôtTotale = (SELECT ....,[snip]....)
WHERE TransfertsFonds.IDTransfertFonds IN (
SELECT i.IDTransfertFonds
FROM INSERTED i
)
Et le problème que j'ai aujourd'hui est un moyen de mettre à jour de manière asynchrone certaines métadonnées après l'insertion ou la modification d'une ligne:
CREATE TRIGGER dbo.UpdateValeurCDR POUR INSERT, UPDATE AS
UPDATE LCDs
SET ValeurCDR = (SELECT ....[snip]....)
WHERE LCDs.GUIDLCD IN (
SELECT i.GUIDLCD
FROM INSERTED i
)
Mise à jour 2: J'ai pensé à créer une dll native ou gérée et à l'utiliser comme une procédure étendue stockée. Le problème avec cela est:
- vous ne pouvez pas scripter un binaire
- je n'y suis pas autorisé