Как создать триггер, который отслеживает изменения в определенных столбцах? - PullRequest
0 голосов
/ 26 марта 2019

В базе данных PostgreSQL у меня есть таблица с именем SURVEYS, которая выглядит следующим образом:

| ID (uuid)                            | name (varchar) | status (boolean) | update_at (timestamp)    |  
|--------------------------------------|----------------|------------------|--------------------------|
| 9bef1274-f1ee-4879-a60e-16e94e88df38 | Doom           | 1                | 2019-03-26 00:00:00      |

Как видите, в таблице есть столбцы status и update_at.

Моя задача - создать триггер, который запустит функцию, если пользователь обновит значение в столбце status до 2 и изменит значение в столбце update_at.В функции я бы использовал идентификатор записи, которая была изменена.Я создал такой триггер.Как вы думаете, правильно ли проверять значения столбцов в триггере, или мне нужно проверить это в функции?Я немного смущен.

CREATE TRIGGER СHECK_FOR_UPDATES_IN_SURVEYS
BEFORE UPDATE ON SURVEYS
FOR EACH ROW
WHEN 
  (OLD.update_at IS DISTINCT FROM NEW.update_at)
AND 
  (OLD.condition IS DISTINCT FROM NEW.condition AND NEW.condition = 2)
EXECUTE PROCEDURE CREATE_SURVEYS_QUESTIONS_RELATIONSHIP(NEW.id);

1 Ответ

1 голос
/ 27 марта 2019

Ваш триггер выглядит просто отлично.

Существует только одна небольшая синтаксическая проблема: все предложение WHEN должно быть заключено в круглые скобки.

Кроме того, вы не можете передать ничего, кромепостоянная функция триггера.Но вам совсем не обязательно это делать: NEW будет доступно в функции триггера автоматически.

Так что вы можете написать это так:

CREATE TRIGGER СHECK_FOR_UPDATES_IN_SURVEYS
BEFORE UPDATE ON SURVEYS
FOR EACH ROW
WHEN 
  (OLD.update_at IS DISTINCT FROM NEW.update_at
   AND
   OLD.condition IS DISTINCT FROM NEW.condition AND NEW.condition = 2)
EXECUTE PROCEDURE CREATE_SURVEYS_QUESTIONS_RELATIONSHIP();

Это всегдапредпочтительнее проверять условия в определении триггера, поскольку это избавит вас от ненужных вызовов функций.

...