Mise à jour d'une colonne dans un déclencheur après la mise à jour seule colonne de la même table dans SQL Server 2008
J'ai le tableau suivant avec cette structure:
CREATE TABLE [dbo].[Tasks]
(
[TasksID] [int] IDENTITY(1,1) NOT NULL,
[CommitteeID] [int] NULL,
[TransactionDateTime] [datetime2](7) NULL,
[inspectionStatus] [nvarchar](50) NULL,
[Latitude] [nvarchar](50) NULL,
[Longitude] [nvarchar](50) NULL,
[acceptanceState] [nvarchar](50) NULL,
[comments] [nvarchar](350) NULL,
[ScheduledDateTime] [datetime2](7) NULL,
)
Ce que je veux exactement est de créer un déclencheur de mise à jour [TransactionDateTime]
avec la dateheure actuelle, seulement si la colonne [acceptanceState]
est mis à jour.
J'ai créé le déclencheur suivant
CREATE TRIGGER [dbo].[TransactionDateUpdate]
ON [dbo].[Tasks]
AFTER UPDATE
AS BEGIN
UPDATE dbo.Tasks
SET TransactionDateTime = GETDATE()
FROM INSERTED i
WHERE i.TasksID = Tasks.TasksID
END
Le problème avec ce déclencheur, qu'il met à jour la colonne [TransactionDateTime]
mais si j'ai fait le changement sur toute la colonne dans la table, et ce que je veux, c'est de mettre à jour [TransactionDateTime]
seulement si la colonne [acceptanceState]
est modifié ou mis à jour. Puis-je trouver de l'aide? Comment faire pour ajouter la condition de la mise à jour [TransactionDateTime]
seulement si [acceptanceState]
est modifié/mis à jour?
J'ai beaucoup cherché pour le même problème mais je n'ai pas trouvé exactement le même problème.
Aussi je crois que SQL Server a une fonction "SI une mise à JOUR(ColumnName)" qui permet de vérifier si une certaine colonne a été mis à jour.
comment est-ce que ce travail sur plusieurs lignes de mise à jour, si?
un problème avec l'utilisation de la mise à JOUR(ColumnName) est qu'elle retourne true si la colonne est inclus dans la mise à jour. Il ne tient pas compte des valeurs réelles. En d'autres termes, il serait de retour vrai même si les nouvelles et les anciennes valeurs sont les mêmes.
Vrai, @SeanLange, SI la mise à JOUR() peuvent être utilisés pour épargner le processeur de l'exécution d'une requête lorsqu'une colonne ne peut pas avoir changé, mais il fait exactement comme vous le dites, retourne true si la colonne a été inclus dans la mise à jour de la déclaration, peu importe si la valeur a changé.
OriginalL'auteur amal50 | 2015-05-04
Vous devez vous connecter pour publier un commentaire.
Vous avez juste besoin d'ajouter une vérification de mise à JOUR et de rejoindre table supprimée dans votre déclencheur:
Heureux d'entendre cela! Si vous pouviez s'il vous plaît me faire une faveur et de le marquer comme " accepté de répondre, ce serait merveilleux! Merci!
J'ai marqué, désolé, je suis nouveau ici, je ne connaissais pas cette marque avant
Pas de soucis! 🙂 J'apprends quelque chose de nouveau tous les jours ici! Merci encore!
seulement de se renseigner sur cette capacité à cocher de la colonne qui est mis à jour. nouveau pour moi !
OriginalL'auteur FutbolFan
La meilleure façon de le faire est de comparer les
Inserted
etDeleted
pseudo de la table. Dans unAFTER UPDATE
déclencheur, leDeleted
pseudo de la table contient les valeurs anciennes, tandis queInserted
contient les nouveaux. Donc, si leDeleted.acceptanceState
n'est pas le même queInserted.acceptanceState
, alors que la colonne a été mis à jour.De sorte que vous devez légèrement prolonger votre détente comme ceci:
WHERE
disposition incluentnull
trop?AND (i.acceptanceState <> d.acceptanceState OR d.acceptanceState IS NULL AND i.acceptanceState IS NOT NULL)
OriginalL'auteur marc_s