2013-07-16 14 views
6

Ho il seguente MySQL triggerottenere il valore OLD in MySQL trigger dopo l'aggiornamento Dichiarazione

SET @iUserId = OLD.LastChangedBy; 

IF NOT NEW.LastChangedBy <=> OLD.LastChangedBy THEN 
    SET @iUserId = NEW.LastChangedBy; 
END IF; 

IF NOT NEW.BookingId<=> OLD.BookingId THEN 
    INSERT INTO AuditTrail VALUES (UUID(),@iUserId,'UPDATE','Booking', OLD.BookingId,'BookingType ',OLD.BookingType ,NEW.BookingType ,NOW()); 
END IF; 

Questo è chiamato come CREATE TRIGGER Booking_AUPD DOPO L'AGGIORNAMENTO SU PRENOTAZIONE PER OGNI FILA

Il problema che ho è come può Ottengo il valore del campo OLD in un trigger AFTER UPDATE?

+0

Non è chiaro cosa stai chiedendo. Per fare riferimento ai valori delle colonne come erano prima di un UPDATE, all'interno del trigger AFTER UPDATE, fare riferimento a 'OLD.col_name', proprio come avviene per il codice di esempio con i riferimenti a' OLD.LastChangedBy', 'OLD.BookingID' , et al. – spencer7593

+0

Sì esattamente quello. Aggiorno il campo BookingType e ho bisogno di ottenere il valore OLD di BookingType nel trigger AFTER UPDATE. È possibile ? – Tommassiov

+0

Sì, il riferimento a 'OLD.BookingType' nel corpo del trigger restituirà il valore della colonna' BookingType' per la riga come era prima dell'esecuzione dell'istruzione update. Tale riferimento è nella clausola dei valori dell'istruzione INSERT. (Non riesco ancora a capire cosa stai chiedendo.Si nota che INSERT verrà eseguito solo se i valori NEW e OLD della colonna BookingId sono diversi.) – spencer7593

risposta

11

La spiegazione più probabile per ottenere un errore

"There is no OLD row in on INSERT trigger" 

è che si sta eseguendo una dichiarazione che è la creazione di un AFTER INSERT grilletto, piuttosto che la creazione di un AFTER UPDATE grilletto.

Il motivo per cui non è possibile fare riferimento ai valori OLD dalla riga, poiché la riga esistente prima di INSERT, è che la riga non esisteva prima di INSERT.

7

In un UPDATE TRIGGER, è possibile utilizzare la parola chiave OLD per accedere ai dati di riga che vengono sostituiti dall'aggiornamento. La parola chiave NEW consente di accedere ai dati della riga in entrata che sostituiranno la vecchia riga, se ha esito positivo.

Un esempio di UPDATE trigger è:

CREATE TRIGGER upd_check AFTER UPDATE ON SomeTable 
    FOR EACH ROW 
    BEGIN 
     IF (OLD.LastChangedBy <> NEW.LastChangedBy) THEN 
     INSERT INTO AuditSomeTable(ID, LastChangedBy) 
     VALUES (OLD.ID, OLD.LastChangedBy); 
     END IF; 
    END; 

SQLFiddle qui

A seconda del tipo di trigger creati, i OLD e NEW righe non possono essere a vostra disposizione:

INSERTO TRIGGER

  • Accesso solo alle righe pseudo NEW.

UPDATE TRIGGER

  • Accesso agli NEW e OLD pseudo righe

trigger DELETE

  • accesso solo al OLD righe pseudo

cioè non v'è alcuna OLD fila su un INSERT grilletto, e nessun NEW fila su un trigger DELETE.

del PO domanda

OP non ha fornito il codice vero e proprio, e il messaggio di errore di cui nei commenti:

Non c'è fila Vecchio in su trigger INSERT

indica che l'OP ha creato inavvertitamente un INSERT TRIGGER e non un UPDATE TRIGGER come indicato nella domanda. Un trigger INSERT non ha una pseudo tabella OLD.

1

Se ricevo la tua domanda giusta ..

La risposta è no! Non puoi avere OLD.col_name in un trigger AFTER UPDATE.

Per il vostro riferimento nel manuale di rif mysql Detta chiaramente che:

In un trigger INSERT, solo NEW.col_name può essere utilizzato; non c'è una vecchia fila. In un trigger DELETE, è possibile utilizzare solo OLD.col_name; non c'è una nuova riga. In un trigger UPDATE, è possibile utilizzare OLD.col_name per fare riferimento alle colonne di una riga prima di essere aggiornate e NEW.col_name per fare riferimento alle colonne della riga dopo che è stata aggiornata.

Trigger Syntax

6

Nel corpo di innesco, i vecchi e nuovi parole chiave che consentono di accedere alle colonne nelle righe interessate da un trigger. OLD e NEW sono estensioni MySQL ai trigger; non sono case sensitive

In un trigger INSERT, è possibile utilizzare solo NEW.col_name; non c'è una vecchia fila. In un trigger DELETE, è possibile utilizzare solo OLD.col_name; non c'è una nuova riga. In un trigger UPDATE, è possibile utilizzare OLD.col_name per fare riferimento alle colonne di una riga prima di essere aggiornate e NEW.col_name per fare riferimento alle colonne della riga dopo che è stata aggiornata.

Problemi correlati