2010-07-02 10 views
3

Vous trouverez ci-dessous un déclencheur de mise à jour SQL Server 2005. Pour chaque mise à jour de la table email_subscriberList où l'indicateur isActive change, nous insérons un enregistrement d'audit dans la table email_Events. Cela fonctionne correctement pour les mises à jour simples, mais pour les mises à jour en bloc, seule la dernière ligne mise à jour est enregistrée. Comment puis-je convertir le code ci-dessous pour effectuer une insertion pour chaque ligne mise à jour?Déclencheur de mise à jour SQL Server pour les mises à jour groupées

CREATE TRIGGER [dbo].[Email_SubscriberList_UpdateEmailEventsForUpdate_TRG] 
ON [dbo].[Email_subscriberList] 
FOR UPDATE 
AS 
DECLARE @CustomerId int 
DECLARE @internalId int 
DECLARE @oldIsActive bit 
DECLARE @newIsActive bit 
DECLARE @email_address varchar(255) 
DECLARE @mailinglist_name varchar(255) 
DECLARE @email_event_type varchar(1) 

SELECT @oldIsActive = isActive from Deleted 
SELECT @newIsActive = isActive from Inserted 

IF @oldIsActive <> @newIsActive 

BEGIN 

IF @newIsActive = 1 
    BEGIN 
    SELECT @email_event_type = 'S' 
    END 
ELSE 
    BEGIN 
    SELECT @email_event_type = 'U' 
    END 


SELECT @CustomerId = customerid from Inserted 
SELECT @internalId = internalId from Inserted 
SELECT @email_address = (select email from customer where customerid = @CustomerId) 
SELECT @mailinglist_name = (select listDescription from Email_lists where internalId = @internalId) 

INSERT INTO Email_Events 
(mailshot_id, date, email_address, email_event_type, mailinglist_name) 
VALUES 
(@internalId, getDate(), @email_address, @email_event_type,@mailinglist_name) 

END 
+0

Comment faites-vous la mise à jour en vrac? – Rup

+0

Plusieurs applications mettront à jour cette table. –

Répondre

2

exemple

non testé

CREATE TRIGGER [dbo].[Email_SubscriberList_UpdateEmailEventsForUpdate_TRG] 
ON [dbo].[Email_subscriberList] 
FOR UPDATE 
AS 


INSERT INTO Email_Events 
(mailshot_id, date, email_address, email_event_type, mailinglist_name) 
SELECT i.internalId,getDate(),c.email, 
case i.isActive when 1 then 'S' else 'U' end,e.listDescription 
from Inserted i 
join deleted d on i.customerid = d.customerid 
and i.isActive <> d.isActive 
join customer c on i.customerid = c.customerid 
join Email_lists e on e.internalId = i.internalId 
+0

Ne consignerait-il pas toutes les mises à jour, pas seulement celles où IsActive est modifié? –

+0

a ajouté une autre jointure – SQLMenace

2

jointures externes gauche, dans le cas où il n'y a pas d'entrées liées à la clientèle ou email_Lists (comme cela est possible dans le code actuel) - les rendre intérieure joint si vous savez qu'il y aura des données présentes (c'est-à-dire que les clés étrangères sont en place). Testez-le bien, en particulier pour les problèmes de simultanéité. Ces jointures dans la gâchette me rendent nerveux.

Questions connexes