@CenterJoin

Триггер UPDATE с условием?

Как создать триггер с условием.?
Нужно чтобы триггер срабатывал, когда обновляется определенное поле.
Например, чтобы при обновлении поля example_field обновились все поля example_field со значением обновляемого поля example_field (извините за тавтологию).

create trigger c_custom_field
    after update
        of custom_field
    on contact
    for each row
execute procedure contact_custom_field();


create function contact_custom_field() returns trigger
    language plpgsql
as
$$
BEGIN
    UPDATE contact
        SET custom_field = NEW.custom_field
    WHERE user_id = OLD.user_id;
    RETURN NEW;
END;
$$;


Попытка обновить:
UPDATE contact
SET custom_field = '{"id":10,"value":780}'
WHERE id=785;


Ответ:
[54001] ERROR: stack depth limit exceeded Hint: Increase the configuration parameter "max_stack_depth" (currently 2048kB), after ensuring the platform's stack depth limit is adequate. Where: SQL statement "UPDATE contact SET custom_field = NEW.custom_field WHERE user_id = OLD.user_ ...
  • Вопрос задан
  • 142 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Akina
Сетевой и системный админ, SQL-программист.
Пример
CREATE FUNCTION fn_test() 
RETURNS TRIGGER
AS $fn_test$
BEGIN
    IF OLD.val1 <> NEW.val1 THEN   -- задать условие
        NEW.id := NEW.id * 10;     -- выполнить действие
    END IF;
    RETURN NEW;
END;
$fn_test$ LANGUAGE plpgsql;

CREATE TRIGGER tr_test
BEFORE UPDATE ON test
FOR EACH ROW
EXECUTE FUNCTION fn_test();

DEMO

Или так:
CREATE FUNCTION fn_test() 
RETURNS TRIGGER
AS $fn_test$
BEGIN
    NEW.id := NEW.id * 10;     -- выполнить действие
    RETURN NEW;
END;
$fn_test$ LANGUAGE plpgsql;

CREATE TRIGGER tr_test
BEFORE UPDATE ON test
FOR EACH ROW
WHEN (OLD.val1 <> NEW.val1)   -- задать условие
EXECUTE FUNCTION fn_test();

DEMO
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы