2012-03-31 28 views
6

Estoy tratando de actualizar una tabla de acuerdo con este disparador:PostgreSQL gatillo y filas actualizadas

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

disparador Función:

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; 

El disparador funciona bien. Cuando se actualiza la tabla cars, la tabla hello_cars se actualiza, pero la columna de estado en cada fila se actualiza y contiene el mismo estado nuevo. Debe ser actualizado de acuerdo con una identificación de automóvil.
Creo que mi problema está en la condición: WHERE OLD.ID = NEW.ID; pero no puedo decir lo que está mal.

Gracias de antemano.

Respuesta

5

OLD y NEW son alias de las filas que activaron el desencadenador. Así que cuando se ejecuta una instrucción como

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

entonces la función de activación se ejecutará

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

La parte 42=42 siempre es cierto. Por lo tanto, se actualiza cada fila en hello_cars.

que realmente quieres algo así como

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

o un poco más corto

[...]WHERE id = OLD.ID 

Pero también hay que pensar en lo que sucede, si la actualización inicial cambia cars.id. En este caso, OLD.ID no es igual a NEW.ID. ¿Qué debería pasar en la tabla hello_cars en este caso? Pero esa es otra pregunta.

+0

¡Muchas gracias! – Noon

+0

@Shadin: De nada. Consulte [Preguntas frecuentes/Cómo hacer] (http://stackoverflow.com/faq#howtoask) cómo aceptar la respuesta que más le ayudó. –

6

OLD.ID y NEW.ID se hace referencia a los valores en la fila actualizada de la tabla cars y por lo tanto (a menos que cambie el ID de cars) siempre será evaluada como verdadera y por lo tanto se actualizan todas las filas de hello_cars.

creo que es probable que desee:

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

Esto supone que hay una columna en la tabla idhello_cars que coincide con el id en cars.

+0

¡Muchas gracias! funciona genial – Noon

Cuestiones relacionadas