как заставить триггер работать только для определенных столбцов (они выбираются по их идентификатору) после обновления - PullRequest
0 голосов
/ 22 мая 2019

У меня есть две таблицы. Билеты, в которых есть столбцы: ticketid, startdate, enddate и транзакции, в которых есть столбцы: transactionid, ticketid (fk to tickets), ticketcost. Я хочу создать триггер на тикетах, который делает скидку на costcost транзакций (транзакций таблицы) всякий раз, когда обновляется конечная дата тикета. транзакции могут иметь один и тот же тикет.

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

первая попытка:

create or replace function changeDate() returns trigger as $changeDate$

    BEGIN
        IF  new.enddate != old.enddate  THEN
            update transactions
            set ticketcost = ticketcost - ticketcost*0.1
            from tickets
            where tickets.ticketid= transactions.ticketid;

        END IF;
        return new;
    END
$changeDate$ LANGUAGE plpgsql;

CREATE TRIGGER changeDate after UPDATE ON tickets
    FOR EACH ROW EXECUTE FUNCTION changeDate();

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

То, что у меня сейчас есть, это:

create or replace function changeDate() returns trigger as $changeDate$
    Declare
            arg1 integer;
    BEGIN
        IF  new.enddate != old.enddate  THEN
            update transactions
            set ticketcost = ticketcost - ticketcost*0.1
            from tickets
            where arg1 = transactions.ticketid;

        END IF;
        return new;
    END
$changeDate$ LANGUAGE plpgsql;

CREATE TRIGGER changeDate after UPDATE ON tickets
    FOR EACH ROW 
    WHEN (new.enddate != old.enddate) 
    EXECUTE FUNCTION changeDate(tickets.ticketid);

Я пытался передать только идентификатор заявки с разными новыми и старыми датами. Запрос работает, но ничего не изменилось. В основном я пытаюсь найти способ передать идентификатор заявки, у которой была конечная дата поле изменилось. В приведенном выше примере я пытаюсь передать его как переменную, когда возникает условие, которое я описал. Любая помощь будет принята, поскольку я не могу найти решение.

1 Ответ

0 голосов
/ 22 мая 2019

Вы можете ограничить срабатывание триггера только тогда, когда дата была обновлена, указав имя столбца и убедившись, что обновленное значение не совпадает со старым:

CREATE TRIGGER changeDate after UPDATE OF enddate ON tickets
FOR EACH ROW 
WHEN (OLD.enddateIS DISTINCT FROM NEW.enddate )
EXECUTE FUNCTION changeDate();

Внутри функции триггера вы можете напрямую обращаться к NEW.ticketID

create or replace function changeDate() returns trigger as $changeDate$
BEGIN

    update transactions
    set ticketcost = ticketcost - ticketcost*0.1
    where transactions.ticketid = NEW.ticketid;

    return new;
END
$changeDate$ LANGUAGE plpgsql;

PS: поскольку функция не меняет дату, лучшим названием будет setDiscount

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