SE UPDATE() in SQL server trigger

Se c’è:

IF UPDATE (col1)

…in SQL server trigger su un tavolo, non si restituisce true solo se col1 è stato modificato o non è stato aggiornato?

Ho una normale query di aggiornamento come

UPDATE table-name 
   SET col1 = 'x', 
       col2 =  'y' 
 WHERE id = 999

Ora che la mia preoccupazione è se il “col1” è stato ‘x’ in precedenza, poi di nuovo si sono aggiornati per ‘x’
sarebbe IF UPDATE ("col1") trigger restituire Vero o no?

Mi trovo di fronte a questo problema come il mio salva query è generico per tutte le colonne, ma quando ho aggiunto questa condizione restituisce True anche se non è cambiato…Così mi riguarda cosa fare in questo caso se voglio aggiungere condizione del genere?

InformationsquelleAutor Jason M | 2010-01-29

 

8 Replies
  1. 46

    Restituisce true se una colonna è stata aggiornata. Un aggiornamento significa che la query di IMPOSTARE il valore della colonna. Se il valore precedente era lo stesso come il nuovo valore è in gran parte irelevant.

    UPDATE table SET col = col

    si tratta di un aggiornamento.

    UPDATE table SET col = 99

    quando col già avuto valore 99, inoltre, si tratta di un aggiornamento.

    • Nota che su un INSERTO, l’AGGIORNAMENTO() restituisce 1 per TUTTE le colonne. Di corso.
    • E ELIMINARE?
    • Si rivelasse funzione UPDATE() non restituisce il valore true per le Eliminazioni. stackoverflow.com/questions/29286034
  2. 10

    All’interno del trigger, è possibile accedere a due tabelle interne che possono aiutare. Il ‘inserito’ la tabella include la nuova versione di ogni riga interessata, Il ‘cancellato’ la tabella include la versione originale di ogni riga. È possibile confrontare i valori in queste tabelle per vedere se il valore del campo è stato effettivamente cambiato.

    • In realtà, quello che volevo questo controllo in modo che l’esecuzione non andare oltre se non c’è nessun aggiornamento
    • assicurarsi di utilizzare un’istruzione if con le tabelle inserted e deleted di confrontare l’originale e nuovi valori – se il campo è cambiato, fare la tua cosa – se non, non
  3. 2

    Ciò che devi fare è controllare per diversi valori in tabelle inserted e deleted piuttosto che utilizzare aggiornato() (non dimenticate di considerare nulli). Oppure si potrebbe smettere di fare necessari aggiornamenti.

  4. 2

    Ecco un modo rapido per analizzare le righe per vedere se una colonna cambiato prima di decidere di eseguire il contenuto di un trigger. Questo può essere utile per esempio quando si vuole scrivere una storia, ma non voglio farlo per se nulla di veramente cambiato.

    Usiamo questo per tutto il tempo in ETL importazione di processi in cui si possono re-importare i dati, ma se nulla di veramente cambiato nel file di origine non vogliamo creare un nuovo record di storia.

    CREATE TRIGGER [dbo].[TR_my_table_create_history]
    ON [dbo].[my_table] FOR UPDATE AS
    
    BEGIN
    
        --
        -- Insert the old data row if any column data changed
        --
        INSERT INTO [my_table_history]
        SELECT  d.*
        FROM    deleted d
        INNER JOIN inserted i ON i.[id] = d.[id]
        --
        -- Use INTERSECT to see if anything REALLY changed
        --
        WHERE   NOT EXISTS( SELECT i.* INTERSECT SELECT d.* )
    
    END

    Notare che questo particolare trigger presuppone che la tabella di origine (quella che ha attivato il trigger) e la tabella di storia identico layout di colonna.

  5. 1

    Di scelta rapida “Nessun aggiornamento vero e proprio” caso, è necessario anche controllare all’inizio se la query interessato tutte le righe a tutti:

    set nocount on; -- this must be the first statement!
    if not exists (select 1 from inserted) and not exists (select 1 from deleted)
      return;
  6. 1
    cREATE TRIGGER boo  ON status2 FOR UPDATE AS 
    IF UPDATE (id)
    BEGIN
    SELECT 'DETECT'; 
    END;
    
    UPDATE status2 SET name = 'K' WHERE name= 'T' --no action 
    UPDATE status2 SET name = 'T' ,id= 8 WHERE name= 'K' --detect
  7. 0
    SET NOCOUNT ON;
    
        declare @countTemp int
        select @countTemp = Count (*) from (
        select City,PostCode,Street,CountryId,Address1 from Deleted
        union
        select City,PostCode,Street,CountryId,Address1 from Inserted
        ) tempTable
    
        IF ( @countTemp > 1 )
    
    Begin
    
    -- Your Code goes Here
    End
    
    -- if any of these  "City,PostCode,Street,CountryId,Address1" got updated then trigger
    
    -- will  work in " IF ( @countTemp > 1 ) " Code)
  8. 0

    Questo ha funzionato per me

    DECLARE @LongDescDirty bit = 0
    
    Declare @old varchar(4000) = (SELECT LongDescription from deleted)
    Declare @new varchar(4000) = (SELECT LongDescription from inserted)
    
    if (@old <> @new)
        BEGIN
            SET @LongDescDirty = 1
        END
    
    Update table
      Set LongDescUpdated = @LongDescUpdated

    …..

    • Non è sicuro come inserted e deleted può contenere più di un record, se l’istruzione UPDATE è stato applicato a diversi record.

Lascia un commento