2012-05-11 11 views
17

Come posso determinare se qualcosa è cambiato nel trigger UPDATE? Ad esempio, ho una persona di nome tabella con solo una colonna NOME che contiene il valore 'Mike'. Se corroCome determinare se qualcosa è stato modificato nel trigger di aggiornamento in t-sql

UPDATE person SET NAME = 'Mike' 

come posso determinare nel trigger di aggiornamento che nulla è cambiato? Conosco l'istruzione UPDATE (col) , ma non voglio scorrere le colonne. C'è qualche altro modo per realizzare questo?

risposta

30

L'aggiornamento (colonna) indica semplicemente che la colonna ha partecipato all'aggiornamento, ma non che il suo valore è stato modificato. Ad esempio,

update Person SET Name = Name 

restituisce true in aggiornamento (nome) anche se Nome non è stato modificato in alcuna riga.

Per verificare se i nuovi valori differiscono da quelli vecchi, si impiegherebbe except perché tranne rimuoverà le righe dal set superiore esistenti nel set inferiore. Poiché la tabella delle persone ha probabilmente una chiave primaria, non vi è il rischio di rimuovere elementi modificati che hanno una controparte in essa cancellata. Tuttavia, se decidi di cambiare * in un elenco di colonne interessanti assicurati di includere la chiave primaria.

Il vantaggio aggiunto è che questo funziona anche per gli inserti, perché Eliminato sarà vuoto e verranno restituite tutte le righe inserite.

+0

Grazie, funziona per me! –

14

riferimento alla risposta di Arion sopra:

essere sicuri di confrontare i record con la loro chiave primaria quando si seleziona da una JOIN dal INSERITO e le tabelle DELETED possono contenere più di un record, il che - se ignorate - possono provocare sia sbagliato interrogare i risultati e l'impatto negativo sulle prestazioni del DB.

-- Anrion's answer - slightly modified 
CREATE TRIGGER UpdatedTriggerName 
ON person -- table name 
AFTER UPDATE 
AS 
IF EXISTS (
    SELECT 
     * 
    FROM 
     INSERTED I 
     JOIN 
     DELETED D 
      -- make sure to compare inserted with (same) deleted person 
      ON D.ID = I.ID 
      AND D.NAME <> I.NAME -- only persons with changed name 
    ) 
print 'something' 
GO 
+1

Ottima risposta! –

Problemi correlati