Триггер PostgreSQL для обновления одного значения на основе суммы трех других - PullRequest
1 голос
/ 22 марта 2020

Я пытаюсь, чтобы логическое значение стало истинным, когда сумма трех целых чисел равна 100, и ложным, когда сумма не равна 100.

Я выполняю триггерную функцию в Postgres, чтобы сделать это, но получаю следующую ошибку:

ОШИБКА: «db_fondos.checksize» не известная переменная Строка 6: DB_Fondos.CheckSize = true;

Надеюсь, вы мне поможете. Код:

CREATE FUNCTION check_sum()
    RETURNS TRIGGER
AS $$
BEGIN
    IF DB_Fondos.SizeLarge+DB_Fondos.SizeMid+DB_Fondos.SizeSmall=100 then
    DB_Fondos.CheckSize=true;
    END IF;
    RETURN NEW;
END;
$$
LANGUAGE plpgsql;

Ответы [ 2 ]

3 голосов
/ 22 марта 2020

Почему бы просто не использовать для этого вычисляемый столбец вместо триггера? База данных управляет вычислениями за вас, и вы всегда получаете актуальное значение при запросе к таблице:

create table DB_Fondos (
    ...
    SizeLarge int,
    SizeMid int,
    SizeSmall int,
    check_sum boolean generated always as (
        coalesce(SizeLarge, 0) 
        + coalesce(SizeMid, 0) 
        + coalesce(SizeSmall, 0) = 100
    )
);
1 голос
/ 22 марта 2020

В триггере вы ссылаетесь на вновь вставленную строку с NEW, а не с именем таблицы:

CREATE FUNCTION check_sum()
    RETURNS TRIGGER
AS $$
BEGIN
    IF NEW.SizeLarge + NEW.SizeMid + NEW.SizeSmall = 100 THEN
        NEW.CheckSize = true;
    END IF;
    RETURN NEW;
END;

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