Domanda

Se riceviamo una dichiarazione di aggiornamento che non controlla se il valore è cambiato nella clausola in cui, quali sono i diversi modi di ignorare che si aggiornano in un trigger?

So che possiamo fare un confronto di ogni singolo campo (la manipolazione del lato ISNULL pure), ma dove si tratta di una tabella che ha oltre 50 campi, c'è un / modo più veloce più facile farlo?

Nota: Questo potrebbe essere utilizzato per ridurre IO / rumore nei record di controllo ecc ...

Esempio

Per una tabella di:

CREATE TABLE myTest
(ID int NOT NULL IDENTITY(1,1), 
 Field1 varchar(10) NULL,
 Field2 varchar(20) NULL)

con un dopo aggiornamento di innesco contenente:

INSERT INTO myTestAudit (ID, Field1, Field2, DateTimeUpdate)
SELECT ID, Field1, Field2, getDate()
FROM inserted

con i valori iniziali:

INSERT INTO myTest (Field1, Field2)
SELECT 'a', 'b' UNION ALL
SELECT 'a', 'c'

Ora eseguire un aggiornamento:

UPDATE myTest set Field2 = 'b' WHERE Field1 = 'a'
È stato utile?

Soluzione

Per riportare le righe in cui almeno un valore è cambiato è possibile utilizzare

SELECT /*TODO: Column List*/
FROM   INSERTED I
       JOIN DELETED D
         ON I.ID = D.ID
            AND EXISTS (SELECT I.*
                        EXCEPT
                        SELECT D.*)  

Altri suggerimenti

Mettere questo come la prima riga nel innesco:

-- Exit trigger if no data was actually modified
IF (@@ROWCOUNT  = 0)  return

I fare questo in tutti i miei trigger di controllo. E 'breve e al punto, sicuramente riduce il sprecato I / O.

Aggiornamento: Scusa, ho letto male la tua domanda. Ho pensato che lei ha chiesto come uscire dal grilletto se non ci sono dati è cambiato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top