effet de déclenchement T-SQL un changement avant d'appeler tout autre code

voix
0

J'ai une table, laissez de l'appel est [MYTABLE] , avec un INSERT POUR IGNORE, UPDATE déclencheur.

Le déclencheur a besoin d'exécuter une procédure stockée, qui fera un travail sur la base des modifications apportées à [MYTABLE] . Je ne peux pas déplacer le code de la procédure stockée dans la gâchette.

Jusqu'à présent, si bon ... puisque les déclencheurs exécutent après les modifications sont apportées, la procédure stockée n'a pas besoin d'accéder aux [insérer] ou [supprimé] métatables.

Mais ... la gâchette doit changer un champ supplémentaire (un [LastModified] smalldatetime) de sorte que la procédure stockée peut utiliser ces données dans son traitement. C'est pas si la procédure stockée peut voir ce qui a été inséré / mise à jour ... la procédure peut faire un certain nombre de choses basées sur d' autres documents qui ne sont pas inclus dans la mise à jour son déclenchement.

Le problème est, si mon déclencheur change [LastModified] , qui soit ne rien du tout (si je déclencheurs récursifs désactivé), ou il finira par appeler la procédure stockée deux fois - une fois en raison du changement de déclenchement d' origine, et encore à cause de mon changement [LastModified] .

Comment puis - je contourner ce donc (a) [LastModified] est mise à jour à chaque changement et (b) la procédure stockée est appelée uniquement après qu'il ait accès à la nouvelle valeur de [LastModified] ?

J'ai deux idées que je pense à, mais ils drôle d'odeur, donc je préfère voir s'il y a une solution plus simple.

Modifier:

Ok, voici les solutions que j'ai jusqu'à présent, cela peut-être aider à la discussion:

1. Utiliser deux déclencheurs. Un, un « pour » déclencheur, gérerait la mise à jour de l'enregistrement de l'utilisateur et changerait LastModified, mais serait revenir rapidement si la mise à jour vient de la SP (il peut indiquer basé sur les colonnes sont modifiées). L'autre serait un déclencheur « après », qui appellerait l'EXEC. Ce déclencheur obtient les mises à jour avec la colonne LastModified déjà appliquée par le déclencheur INSTEAD OF. J'espère que ce comment cela fonctionne au moins.

2. Déplacer ModifiedDate à une autre table. De cette façon, je peux avoir un seul INSERT déclencheur AFTER IGNORE / UPDATE qui, uniquement si l'utilisateur lance l'INSERT IGNORE / UPDATE, ajoute un enregistrement d'audit à l'autre table et appelle la SP. Le SP serait alors modifier d' autres dossiers, qui provoqueraient le déclencheur à nouveau le feu, mais il reconnaîtrait rapidement la situation et le retour sans faire plus de travail.

L'inconvénient de la première solution est que je dois maintenir une liste de colonnes dans le déclencheur de sorte que la mise à jour INSTEAD OF ne fait le travail prévu (depuis que je suis d'ajouter une colonne à la liste, ModifiedDate, je ne peux pas INSERT IGNORE EN TBL dE inséré, je dois spécifier des colonnes).

Créé 26/08/2009 à 23:26
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
3

Avez-vous essayé l'instruction IF UPDATE (LastModified)?

CREATE TRIGGER XYZ ON MYTABLE 
FOR INSERT IGNORE , UPDATE 
AS 
BEGIN 
IF UPDATE(LastModified) 
  RETURN 
ELSE 
  BEGIN
    UPDATE MYTABLE SET LastModified = GETDATE() 
    FROM MYTABLE INNER JOIN INSERT IGNORE ED ON MYTABLE.ID = INSERT IGNORE ED.ID
    EXEC TheStoreProc
  END
END;
Créé 27/08/2009 à 02:53
source utilisateur

voix
0

Je ne suis pas sûr que je comprends le flux que vous décrivez. Est-ce:

  1. Enregistrement est mis à jour
  2. Mise à jour de déclenchement proc est appelé
  3. trigger met à jour le terrain LastModified
  4. déclencheur appelle un autre proc

qui devrait fonctionner très bien, aussi longtemps que le « autre proc » ne met pas à jour la même table, qui coup d'envoi nouveau sur la détente.

Si le « autre proc » est mise à jour à nouveau la table, vous pourriez peut - être déplacer ces mises à jour dans la gâchette avant d'appeler « un autre proc ».

Est-ce que toute aide?

Créé 27/08/2009 à 03:07
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more