У меня есть 2 таблицы в Postgres, скажем, Category
и Thread
с отношением один ко многим
Category
id | title | created_at | deleted_at
-----+-------+------------+-----------
Thread
id | category_id | title | created_at | deleted_at
-----+-------------+-------+------------+-----------
Я хочу создать триггер: если я выполняю мягкое удаление в Category
(обновляю deleted_at
с нуля до сейчас ()), то Thread
.deleted_at
тоже должен обновиться.
Вот моя функция
CREATE OR REPLACE FUNCTION "thread_soft_delete"()
RETURNS trigger
AS $pg1$
BEGIN
UPDATE thread SET deleted_at = NOW()
FROM "category"
WHERE thread.category_id = "category".id;
RETURN NULL;
END;
$pg1$
VOLATILE
LANGUAGE plpgsql;
И вот спусковой крючок
CREATE TRIGGER category_delete
AFTER UPDATE ON "category"
FOR EACH ROW
WHEN (OLD.deleted_at IS DISTINCT FROM NEW.deleted_at)
EXECUTE PROCEDURE thread_soft_delete();
Когда я запускаю update "category" set deleted_at = now() WHERE id = 1;
, все столбцы created_at
в thread
обновляются. Я ожидаю, что будут обновляться только строки с category_id
= 1.
Помогите, пожалуйста
Вам не нужно ссылаться на таблицу category
в функции триггера. Просто NEW.id()
должно быть нормально.
CREATE OR REPLACE FUNCTION "thread_soft_delete"()
RETURNS trigger
AS $pg1$
BEGIN
UPDATE thread SET deleted_at = NOW()
WHERE thread.category_id = NEW.id;
RETURN NULL;
END;
$pg1$
VOLATILE
LANGUAGE plpgsql;
см .: stackoverflow.com/questions/33034907/…