12
votes

SQL déclencheurs - Comment puis-je obtenir la valeur mise à jour?

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

évidemment cela ne fonctionne pas, mais vous pouvez voir ce que j'essaie d'obtenir à.


0 commentaires

3 Réponses :


20
votes

Fournir que vous êtes certains em> qu'une seule valeur sera jamais 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


0 commentaires

2
votes

En fonction de mes connaissances, vous devez créer un curseur pour boucler toutes les valeurs mises à jour pour exécuter la procédure de mise à jour. N'oubliez pas 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 


0 commentaires

1
votes

Vous pouvez faire quelque chose comme cet exemple où je connecte les modifications à une table d'historique des transactions: xxx pré>

Mais vous pouvez utiliser le même type de technique, mélanger un peu et passer un peu L'ensemble des valeurs à une procédure stockée, comme je le fais dans l'exemple suivant (à l'aide du schéma de table ci-dessus). P>

Premièrement, créez une procédure stockée qui prévoit une table temporelle particulière à l'exécution, donc : P>

create trigger foo_trigger_01 on dbo.foo for insert, update , delete
as
  set nocount                 on
  set xact_abort              on
  set ansi_nulls              on
  set concat_null_yields_null on

  --
  -- create the temp table. This temp table will be in scope for any stored
  -- procedure executed by this trigger. It will be automagickally dropped
  -- when trigger execution is complete.
  --
  -- Any changes made to this table by a stored procedure — inserts,
  -- deletes or updates are, of course, visible to the trigger upon return
  -- from the stored procedure.
  --
  create table #foo_changes
  (
    id        int          not null primary key clustered ,
    action_id int          not null ,
    old_value varchar(200)     null ,
    new_value varchar(200)     null ,
  )

  --
  -- populate the temp table
  --
  insert #foo_changes
  ( 
    id        ,
    action_id ,
    old_value ,
    new_value
  )
  select id = coalesce( i.id , d.id ) ,
         action_id = case
                       when i.id is not null and d.id is     null then 1 -- insert
                       when i.id is not null and d.id is not null then 2 -- update
                       when i.id is     null and d.id is not null then 3 -- delete
                     end ,
         old_value = d.value ,
         new_value = i.value
  from      inserted i
  full join deleted  d on d.id = i.id

  --
  -- execute the stored procedure. The temp table created above is in scope
  -- for the stored procedure, so it's able to access the set of changes from
  -- the trigger.
  --
  exec dbo.foo_changed

go


0 commentaires