En regardant d'autres exemples, j'ai trouvé ce qui suit mais cela ne semble pas fonctionner comme je le souhaiterais: je veux qu'il ne mette à jour les informations modifiées que si la QtyToRepair
valeur a été mise à jour ... mais cela ne fonctionne pas cette.
Si je commente le lieu, les informations modifiées sont mises à jour dans tous les cas. Comme je l'ai dit, d'autres exemples m'ont conduit à être optimiste. Tous les indices appréciés. Merci.
Walter
ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
ON [dbo].[SCHEDULE]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE SCHEDULE SET modified = GETDATE()
, ModifiedUser = SUSER_NAME()
, ModifiedHost = HOST_NAME()
FROM SCHEDULE S
INNER JOIN Inserted I on S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber
WHERE S.QtyToRepair <> I.QtyToRepair
END
sql
sql-server
triggers
Walter de Jong
la source
la source
update()
- il ne teste que si la colonne apparaît dans la liste de mise à jour et est toujours vrai pour les insertions. Il ne vérifie pas si la valeur de la colonne a changé, car vous pouvez avoir plus d'une ligne, où certaines valeurs ont changé et d'autres pas.Réponses:
Vous avez deux voies pour votre question:
1- Utilisez la commande de mise à jour dans votre déclencheur.
2- Utiliser la jointure entre la table insérée et la table supprimée
Lorsque vous utilisez la commande de mise à jour pour la table
SCHEDULE
et définissez laQtyToRepair
colonne sur une nouvelle valeur, si la nouvelle valeur est égale à l'ancienne valeur sur une ou plusieurs lignes, la solution 1 met à jour toutes les lignes mises à jour dans la table de planification, mais la solution 2 ne met à jour que les lignes dont l'ancienne valeur n'est pas égale à nouvelle valeur.la source
inserted
- vous la table dans la deuxième requête? ce devrait être la même chose que la table elle-même, n'est-ce pas?fyi Le code avec lequel j'ai fini:
la source
WHERE S.QtyToRepair <> I.QtyToRepair AND D.QtyToRepair <> I.QtyToRepair
ne se déclenchant jamais / correspondant car le premier critère n'était jamais vrai - la table insérée correspondait toujours à la valeur réelle de la table. Utiliser `WHERE I.QtyToRepair <> D.QtyToRepair` était la clé pour moi. Aussi l'IF UPDATE (field)
aide de plusieurs déclencheurs de tir.On devrait vérifier si
QtyToRepair
est mis à jour dans un premier temps.la source
Vous souhaitez effectuer les opérations suivantes:
Veuillez noter que ce déclencheur se déclenchera chaque fois que vous mettez à jour la colonne, que la valeur soit la même ou non.
la source
Chaque fois qu'un enregistrement a été mis à jour, un enregistrement est "supprimé". Voici mon exemple:
Ça fonctionne bien
la source