Je voudrais me renseigner sur le comportement d'une gâchette (disons "après la mise à jour" déclencheur) qui est supprimé au début d'une transaction puis recréé à la fin d'une transaction, - spécifiquement, la gâchette courir pendant la phase de validation de la transaction (en supposant qu'au milieu de la transaction, j'ai exécuté certains scripts qui déclencheraient normalement la gâchette)? P>
considérer cet exemple. P>
à la ligne n ° 5, lorsque la base de données commet une transaction complète, le déclencheur recréé sera-t-il exécuté ou non? P>
Je voudrais réaffirmer la question si cela n'est pas possible / ou une bonne idée de le faire de cette façon. Au lieu de supprimer / recréer, je crois qu'une meilleure solution consiste à désactiver / activer la gâchette. En cela, lorsque le déclencheur est activé, il fonctionnera-t-il à la fin de la transaction? P>
Comme suggéré par tous, pour mon scénario, faites ceci: p>
Démarrer TX
Désactiver Trig, Exécuter SQL, Activer Trig
Commettre tx p>
La gâchette ne tire pas ce que je veux. p>
3 Réponses :
Si vous désactivez un déclencheur, exécutez et validez une transaction, puis réactivez la gâchette, la gâchette ne sera pas «exécutée» pour la transaction déjà terminée. p>
Je savais que, dans notre cas, la demande de mise à jour nécessite d'exécuter SQL pour réactiver la gâchette comme dernière instruction avant d'avoir commis la transaction.
Les réponses prévoient-elles à réactiver la gâchette comme dernière action de la transaction?
@ActiveX Smoore4 montre exactement comment faire cela, mais Digital.Aaron dit la même chose et l'a dit en premier.
Digital Aaro a déclaré: Pour le faire après commettre, où la solution Smoore4 est de le faire comme la dernière ligne avant de commettre <== Cela fonctionnera pour moi. Merci. On dirait que la chute d'une gâchette pour ce que je veux faire est un mauvais outil pour le travail, ce que je veux, c'est d'utiliser Disable / Activer
La gâchette ne fonctionnera pas si vous activez la gâchette entre l'instruction DML et le COMMENCE; Par exemple, cela ne fera pas l'exécution de la gâchette:
BEGIN TRANSACTION; ALTER TABLE [dbo].[myTable] DISABLE TRIGGER [trg_trgtest] UPDATE [dbo].[myTable] SET [language] = 'fr' WHERE id = 6 ALTER TABLE [dbo].[myTable] ENABLE TRIGGER [trg_trgtest] COMMIT;
déposer une gâchette place une serrure de métadonnées exclusive (SCH-M) sur la table, empêchant toutes les requêtes ou DML, qui nécessitent toutes une serrure de stabilité de schéma (Sch-S), pour la durée de la transaction.
par exemple p> Optputts p> donc lorsque vous déposez une gâchette au début d'une transaction, tout accès à cette table sera bloquée jusqu'à ce que vous vous engagiez ou retourne la transaction. p> et donc p> La gâchette fonctionnera-t-elle pendant la phase de validation de la transaction
(en supposant que au milieu de la transaction, j'ai exécuté certains
Les scripts qui déclencheraient normalement la gâchette)? P>
blockQuote> Ainsi, le script qui "déclencherait normalement la gâchette" deviendra non bloqué et exécuter, déclencher la gâchette comme normale. p> p>
Il existe un moyen facile de répondre à cela vous-même - et c'est de le faire essayer :)
Cela a XY Problème tout dessus.
Si vous aviez même essayé d'essayer cela, vous saurez que vous ne pouvez pas créer de gâchette à l'intérieur d'une transaction car elle doit être la seule instruction dans le lot.
OK Ensuite, qu'en est-il de laisser tomber / recréer un déclencheur, je désactive la gâchette, puis à la fin de TX, je active la gâchette.
L'avez-vous essayé? Mais pourquoi avez-vous besoin de désactiver un déclencheur comme celui-ci? Le point d'un déclencheur est de capturer l'événement. La désactivation plutôt défaite le point d'avoir la gâchette en premier lieu. Mais sérieusement, vous devriez au moins tenter d'essayer cela en premier.
Nous avons une application de mise à jour qui effectue des mises à jour de DB lorsque l'utilisateur met à jour une version à une autre version de notre produit. Bien que l'application de mise à jour effectue des modifications à base de DB, nous ne voulons pas que les déclencheurs déclenchent.
Vous pouvez désactiver une gâchette au début de votre transaction, puis le permettre à nouveau à la fin sans le laisser tomber.
Il suffit de désactiver / activer ... Alter Tableau [DBO]. [MYTABLE] Désactiver la gâchette [trg_trgname]
Non, je ne veux pas exécuter la gâchette, période. C'est pourquoi j'ai posé la question si le déclencheur réactif / ou recréé sera exécuté à la fin.
J'ai gâché le commentaire, je voulais dire le SQL pour activer la gâchette et ne pas exécuter la gâchette elle-même.