2013-07-16 15 views
6

Mam następujący MySQL TrigerGet starą wartość w MySQL wyzwalacz AFTER UPDATE

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; 

ten nazywany jest także tworzyć TRIGGER Booking_AUPD PO UPDATE ON Booking dla każdego wiersza

Problem mam to w jaki sposób Otrzymuję wartość pola OLD w wyzwalaczu PO AKTUALIZACJI?

+0

Nie jest jasne, o co pytasz. Aby odwołać się do wartości kolumn, które były przed AKTUALIZACJĄ, w wyzwalaczu PO AKTUALIZACJI, odwołaj się do 'OLD.col_name', tak jak to robi przykładowy kod z odniesieniami do' OLD.LastChangedBy', 'OLD.BookingID' , et al. – spencer7593

+0

Tak, dokładnie to. Aktualizuję pole BookingType i potrzebuję uzyskać wartość OLED BookingType w wyzwalaczu PO UPDATE. Czy to możliwe ? – Tommassiov

+0

Tak, odniesienie do 'OLD.BookingType' w treści wyzwalacza zwróci wartość kolumny' BookingType' dla wiersza, tak jak przed wykonaniem instrukcji aktualizacji. Odwołanie znajduje się w klauzuli value instrukcji INSERT. (Nadal nie rozumiem, o co prosisz. Zauważmy, że INSERT zostanie wykonane tylko wtedy, gdy wartości NEW i OLD w kolumnie BookingId są różne.) – spencer7593

Odpowiedz

11

Najbardziej prawdopodobnym wyjaśnieniem otrzymuję błąd

"There is no OLD row in on INSERT trigger" 

jest to, że realizują oświadczenie, że tworzenia konta AFTER INSERT spust, zamiast tworzenia AFTER UPDATE spust.

Powodem, dla którego nie można powoływać się na wartości OLD z wiersza, ponieważ wiersz istniał przed INSERT, jest to, że wiersz nie istniał przed INSERT.

7

W UPDATE TRIGGER można użyć słowa kluczowego OLD, aby uzyskać dostęp do danych wiersza, które są zastępowane przez aktualizację. Słowo kluczowe NEW umożliwia dostęp do danych wiersza przychodzącego, który zastąpi stary wiersz, jeśli się powiedzie.

Przykładem UPDATE wyzwalacz jest:

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 tutaj

W zależności od rodzaju spustem stworzony, że OLD i NEW wiersze nie mogą być dostępne dla Ciebie:

WSTAW TRIGGER

  • Dostęp do tylko pseudo wierszy NEW.

UPDATE Wyzwalanie

  • Dostęp do NEW i OLD pseudo rzędach

DELETE Wyzwalanie

  • dostęp tylko do OLD pseudo rzędy

czyli nie OLD rząd na INSERT spust i nie NEW rzędzie na DELETE spustu.

OP Pytanie

OP nie dostarczył rzeczywisty kod, a komunikat o błędzie, o którym mowa w komentarzach:

Nie ma OLD wiersz na wyzwalacz INSERT

oznacza, że ​​OP nieumyślnie utworzył INSERT TRIGGER, a nie UPDATE TRIGGER, jak wskazano w pytaniu. Wyzwalacz INSERT nie ma pseudo tabeli OLD.

1

Jeśli mam pytanie prawy ..

odpowiedź brzmi: nie! Nie możesz mieć OLD.col_name w wyzwalaczu PO UPDATE.

Dla odniesienia w mysql instrukcji ref to wyraźnie wskazuje, że:

W wyzwalacz INSERT, tylko NEW.col_name może być stosowany; nie ma starego wiersza. W wyzwalaczu DELETE można używać tylko OLD.col_name; nie ma nowego wiersza. W wyzwalaczu UPDATE można użyć OLD.col_name, aby odnieść się do kolumn w wierszu, zanim zostanie on zaktualizowany, i NEW.col_name, aby odnieść się do kolumn w wierszu po aktualizacji.

Trigger Syntax

6

W treści wyzwalacza, stare i nowe słowa kluczowe pozwalają na dostęp do kolumn w wierszach dotkniętych przez wyzwalacz. OLD i NEW to rozszerzenia MySQL dla wyzwalaczy; nie są wrażliwe na wielkość liter.

W wyzwalaczu INSERT można użyć tylko nazwy NEW.col; nie ma starego wiersza. W wyzwalaczu DELETE można używać tylko OLD.col_name; nie ma nowego wiersza. W wyzwalaczu UPDATE można użyć OLD.col_name, aby odnieść się do kolumn w wierszu, zanim zostanie on zaktualizowany, i NEW.col_name, aby odnieść się do kolumn w wierszu po aktualizacji.

Powiązane problemy