2012-03-31 14 views
6

Sto cercando di aggiornare una tabella in base a questo trigger:PostgreSQL trigger e righe aggiornate

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

trigger Funzione:

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; 

Il trigger funziona bene. Quando la tabella cars viene aggiornata, la tabella hello_cars viene aggiornata ma la colonna di stato in ogni riga viene aggiornata e contiene lo stesso nuovo stato! Deve essere aggiornato in base a un ID auto.
Penso che il mio problema sia in condizioni: WHERE OLD.ID = NEW.ID; ma non riesco a capire cosa c'è che non va.

Grazie in anticipo.

risposta

5

OLD e NEW sono alias alle righe che hanno attivato il trigger. Così, quando si esegue un'istruzione come

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

quindi la funzione trigger eseguirà

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

La parte 42=42 è sempre vero. Quindi ogni riga in hello_cars viene aggiornata.

si vuole veramente qualcosa di simile

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

o un po 'più corto

[...]WHERE id = OLD.ID 

Ma è anche necessario pensare a ciò che accade, se l'aggiornamento iniziale cambia cars.id. In questo caso OLD.ID non è uguale a NEW.ID. Cosa dovrebbe accadere nella tabella hello_cars in questo caso? Ma questa è un'altra domanda.

+0

Grazie mille! – Noon

+0

@Shadin: prego. Si prega di consultare [Domande frequenti/Come chiedere] (http://stackoverflow.com/faq#howtoask) come accettare la risposta che ti ha aiutato di più. –

6

OLD.ID e NEW.ID fa riferimento valori nella riga aggiornata della tabella cars e quindi (a meno che non si modifica l'ID in cars) sarà sempre valutata come vera e per questo tutte le righe in hello_cars vengono aggiornati.

penso che probabilmente si desidera:

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

Ciò presuppone che v'è una colonna della tabella idhello_cars che corrisponde al id in cars.

+0

Grazie mille! funziona benissimo – Noon

Problemi correlati