Comment obtenir la valeur de l'enregistrement mis à jour dans un déclencheur SQL - quelque chose comme ceci: évidemment cela ne fonctionne pas, mais vous pouvez voir ce que j'essaie d'obtenir à. p> p>
3 Réponses :
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
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
Vous pouvez faire quelque chose comme cet exemple où je connecte les modifications à une table d'historique des transactions: 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