example - trigger sql definition



Déclencheurs SQL-comment obtenir la valeur mise à jour? (2)

Prévoyez que vous êtes certain qu'une seule valeur sera mise à jour, vous pouvez le faire ...

CREATE TRIGGER TR_UpdateNew
   ON  Users
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @user_id INT
    SELECT
      @user_id = inserted.UserID
    FROM
      inserted
    INNER JOIN
      deleted
        ON inserted.PrimaryKey = deleted.PrimaryKey
        -- It's an update if the record is in BOTH inserted AND deleted

    EXEC UpdateProfile @user_id;

END
GO

Si plusieurs valeurs peuvent être mises à jour en même temps, une seule d'entre elles sera traitée par ce code. (Bien que ce ne sera pas une erreur.)

Vous pouvez utiliser un curseur ou, si c'est SQL Server 2008+, vous pouvez utiliser des variables de table.

Ou, plus communément, déplacez simplement le code StoredProcedure dans le déclencheur.

https://src-bin.com

Comment obtenir la valeur de l'enregistrement mis à jour dans un déclencheur SQL - quelque chose comme ceci:

CREATE TRIGGER TR_UpdateNew
   ON  Users
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    EXEC UpdateProfile (SELECT UserId FROM updated AS U);

END
GO

Évidemment, cela ne fonctionne pas, mais vous pouvez voir ce que j'essaie de comprendre.


Answer #1

Sur la base de mes connaissances, vous devrez créer un CURSOR pour faire défiler toutes les valeurs mises à jour pour exécuter la procédure UpdateProfile. Gardez à l'esprit que cela ralentira votre processus de mise à jour.

Declare @UserID int --Assuming
Declare UpdateProfile_Cursor Cursor for Select UserID From inserted;

Open Cursor UpdateProfile_Cursor;

Fetch Next from UpdateProfile_Cursor Into @UserID;

While @@FETCH_STATUS == 0
Begin
  Exec UpdateProfile  @UserID
  Fetch Next from UpdateProfile_Cursor Into @UserID;
End
CLOSE UpdateProfile_Cursor 
DEALLOCATE UpdateProfile_Cursor 

Ma syntaxe peut être un peu éteinte mais cela vous donnera l'effet désiré. Encore une fois, pensez à réviser votre logique pour gérer plusieurs mises à jour car l'utilisation de curseurs demande beaucoup de ressources.





triggers