2012-03-31 12 views
6

Próbuję zaktualizować tabelę według tego wyzwalacza: FunkcjaPostgreSQL wyzwalania i wiersze zaktualizowane

CREATE TRIGGER alert 
AFTER UPDATE ON cars 
FOR EACH ROW 
EXECUTE PROCEDURE update_cars(); 

wyzwalania:

CREATE FUNCTION update_cars() 
RETURNS 'TRIGGER' 
AS $BODY$ 
BEGIN 
IF (TG_OP = 'UPDATE') THEN 
UPDATE hello_cars SET status = new.status 
WHERE OLD.ID = NEW.ID; 
END IF; 
RETURN NULL; 
END; 
$$ LANGUAGE plpgsql; 

Spust działa dobrze. Po zaktualizowaniu tabeli cars tabela hello_cars jest aktualizowana, ale kolumna stanu w każdym wierszu jest aktualizowana i zawiera ten sam nowy status! Musi być aktualizowany zgodnie z identyfikatorem samochodu.
Myślę, że mój problem jest w stanie: WHERE OLD.ID = NEW.ID;, ale nie mogę powiedzieć, co jest nie tak.

Z góry dziękuję.

Odpowiedz

5

OLD i NEW są aliasami do wierszy, które uruchomiły spust. Więc kiedy wykonać instrukcję jak

UPDATE cars SET status='xyz' WHERE cars.id = 42; 

wówczas funkcja wyzwalania wykona

UPDATE hello_cars SET status='xyz' WHERE 42 = 42 

Część 42=42 jest zawsze prawdziwa. W związku z tym zaktualizowano każdy wiersz w hello_cars.

Naprawdę chcesz coś podobnego

[...]WHERE hello_cars.id = OLD.ID 

lub nieco krótsza

[...]WHERE id = OLD.ID 

Ale trzeba także pomyśleć o tym, co się dzieje, jeśli początkowa aktualizacja zmienia cars.id. W tym przypadku OLD.ID nie jest równy NEW.ID. Co powinno się stać w tym przypadku w tabeli hello_cars? Ale to kolejne pytanie.

+0

Dziękuję bardzo! – Noon

+0

@Shadin: Nie ma za co. Proszę zobaczyć [FAQ/How To Ask] (http://stackoverflow.com/faq#howtoask), jak zaakceptować odpowiedź, która pomogła ci najbardziej. –

6

OLD.ID i NEW.ID odwołują wartości w zaktualizowanym wierszu tabeli cars a więc (chyba że zmiany identyfikatora w cars) zawsze oceniać true i do nich wszystkie wiersze w hello_cars są aktualizowane.

myślę prawdopodobnie zechcesz:

UPDATE hello_cars 
    SET status = new.status 
WHERE id = new.id; 

ta zakłada, że ​​istnieje kolumna id w tabeli hello_cars który odpowiada id w cars.

+0

Dziękuję bardzo! działa świetnie – Noon