2013-05-18 33 views
8

Ok. Sono abbastanza nuovo per i trigger SQL e ho avuto alcuni problemi con loro. Il trigger di inserimento funziona bene e anche il trigger Elimina. In un primo momento, l'eliminazione su più righe ne eliminerebbe solo una, ma sono riuscita a capirlo da sola :)Trigger SQL di aggiornamento riga multiplo da singola istruzione SQL di aggiornamento

Tuttavia, anche dopo una ricerca approfondita (qui e su Google) non riesco a trovare una risposta soddisfacente al trigger UPDATE che ho. Se faccio un aggiornamento come

UPDATE Customers Set CustomerUser = 0 Where CustomerStatus = 3 

Quindi, sfortunatamente, solo l'unico record sarebbe stato aggiornato, e l'altro sarebbe rimasto come era. Ovviamente, non va bene.

Il trigger che sto usando è:

ALTER TRIGGER [dbo].[TRG_TriggerName] ON [dbo].[USER_Customers] 

FOR UPDATE 

AS 
declare @customerid int; 
declare @customervenue int; 
declare @customeruser int; 
declare @customerarea int; 
declare @customerevent int; 
declare @customerproject int; 
declare @customerstatus int; 

select @customerid=i.CustomerID from inserted i; 
select @customervenue=i.CustomerVenue from inserted i; 
select @customerarea=i.CustomerArea from inserted i; 
select @customerevent=i.CustomerEvent from inserted i; 
select @customerproject=i.CustomerProject from inserted i; 
select @customeruser=i.CustomerUser from inserted i; 
select @customerstatus=i.CustomerStatus from inserted i; 

Update USER_Instances Set InstanceArea = @customerarea, InstanceVenue = @customervenue, InstanceUser = @customeruser, InstanceStatus = @customerstatus, InstanceEvent = @customerevent, InstanceLastUpdate = GetDate() Where InstanceObject = 17 AND InstanceIdentity = @customerid 
GO 

Come vi renderete subito conto, questo trigger è grande - se si desidera aggiornare un solo record. Altrimenti, fallisce. Ora, la domanda principale sarebbe: come posso prendere tutti i record che necessitano di aggiornamento e aggiornarli tutti in un'unica azione.

Gli esempi che ho visto qui su Stack Overflow mi confondono in qualche modo, o sembrano inefficaci - per esempio, sembra che la maggior parte di loro si occupi di aggiornare solo UN valore in un secondo/altro tavolo, e non un gruppo come me cercando di fare Quelli che sembrano funzionare su più valori, non riesco a capire :(

Quindi dopo circa 2 ore di ricerche, mi arrendo, e spero che tu possa aiutarmi :) Mi rendo conto che questo è un problema di innesco-newbie e sebbene conosca il mio MS-SQL, i trigger sono qualcosa che non ho mai usato fino ad ora. Quindi, qualsiasi aiuto è molto benvenuto :) W

+0

La tabella 'inserted' può contenere più righe. Consiglio a tutti di non usare i grilletti. Sono troppo difficili da ottenere, e anche se lo gestisci, il risultato è molto difficile da mantenere. – Andomar

+0

Bene ... Posso in teoria fare l'aggiornamento con le istruzioni SQL post-aggiornamento, e fintanto che INSERT e DELETE funzioneranno correttamente, questa sarebbe una possibile soluzione di second-best. Ma vorrei ancora tanto sapere come attivare questo trigger ... Sto usando un solo set di trigger perché nella circostanza è esattamente ciò di cui ho bisogno e offre la soluzione migliore :) Grazie per il tuo commento. – Irresistance

+0

@Irresistance I trigger sono una soluzione non preferita per molte ragioni. Come dice Andromar, sono difficili da scrivere e da mantenere. Inoltre influenzano negativamente le prestazioni di INSERT, UPDATE e DELETE, rendono le transazioni più complicate, possono aumentare la possibilità di deadlock e sono un vero Pain per le attività operative. Ma la ragione principale è che sono nascosti alla vista normale, rendendoli effettivamente "magici". I trigger innescano costantemente DBA e sviluppatori perché si dimenticano di essi, causando molti problemi di supporto lunghi e sconcertanti che terminano con "Quella tabella ha trigger?" – RBarryYoung

risposta

13

Sembra che avete bisogno di qualcosa di simile

ALTER TRIGGER [dbo].[TRG_TriggerName] ON [dbo].[USER_Customers] 
FOR UPDATE 
AS 
UPDATE USER_Instances 
    SET InstanceArea = i.CustomerArea, 
     InstanceVenue = i.CustomerVenue, 
     InstanceUser = i.CustomerUser, 
     InstanceStatus = i.CustomerStatus, 
     InstanceEvent = i.CustomerEvent, 
     InstanceLastUpdate = GetDate() 
    FROM USER_Instances JOIN inserted i 
    ON InstanceIdentity = i.CustomerID AND InstanceObject = 17 

Dal inserted tabella virtuale può contenere più righe è necessario JOIN che faccia correttamente il UPDATE.

+0

Tu uomo !! Questo è esattamente ciò di cui avevo bisogno, e mi rimprovero di non aver trovato questa soluzione ovvia ed elegante !! – Irresistance

+0

@ peterm, ho lo stesso problema può controllare il seguente link http://stackoverflow.com/questions/26043106/how-to-determine-if-insert-or-update/26143185#26143185 – Prathyush