Триггер PostgreSQL и строки обновлены - PullRequest
6 голосов
/ 31 марта 2012

Я пытаюсь обновить таблицу в соответствии с этим триггером:

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

Функция триггера:

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;

Триггер работает нормально.Когда таблица cars обновляется, таблица hello_cars обновляется, но столбец состояния в каждой строке обновляется и содержит такой же новый статус!Оно должно быть обновлено в соответствии с идентификатором автомобиля.
Я думаю, что моя проблема в состоянии: WHERE OLD.ID = NEW.ID;, но я не могу сказать, что случилось.

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 31 марта 2012

OLD и NEW - это псевдонимы строк, которые запускают триггер. Поэтому, когда вы выполняете оператор, как

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

, тогда запускается функция триггера

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

Часть 42=42 всегда верна. Таким образом, каждая строка в hello_cars обновляется.

Вы действительно хотите что-то вроде

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

или немного короче

 [...]WHERE id = OLD.ID

Но вам также нужно подумать о том, что произойдет, если начальное обновление изменится cars.id. В этом случае OLD.ID не равно NEW.ID. Что должно произойти в таблице hello_cars в этом случае? Но это другой вопрос.

6 голосов
/ 31 марта 2012

OLD.ID и NEW.ID ссылаются на значения в обновленной строке таблицы cars и, таким образом (если вы не измените идентификатор в cars), всегда будут иметь значение true и, следовательно, все строки в hello_cars обновлены.

Я думаю, вы, вероятно, хотите:

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

Предполагается, что в таблице hello_cars имеется столбец id, который соответствует id в cars.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...