Триггер с несколькими условиями WHEN

Как включить столбцы, которые мне нужно отслеживать? т.е. вместо одного условия WHEN я хочу иметь 3 условия WHEN:

CREATE  TRIGGER freeradius.insert_into_day_summations 
     BEFORE INSERT ON freeradius.day_guiding_usage
     FOR EACH ROW 
     WHEN (OLD.col1 IS DISTINCT FROM NEW.col1)
     WHEN (OLD.col2 IS DISTINCT FROM NEW.col2)
     WHEN (OLD.col3 IS DISTINCT FROM NEW.col3)
EXECUTE procedure update_sessioninfo();

person user2594853    schedule 21.08.2013    source источник
comment
Вы только что пытались объединить их с OR? В документации сказано, что это просто логическое условие. Должен работать нормально.   -  person Dark Falcon    schedule 21.08.2013


Ответы (2)


Сформируйте одно выражение с помощью OR или AND — в зависимости от того, хотите ли вы срабатывать при выполнении всех условий или при выполнении одного из одного условия:

CREATE TRIGGER update_day_summations  -- see below
BEFORE UPDATE ON freeradius.day_guiding_usage
FOR EACH ROW 
WHEN (OLD.col1 IS DISTINCT FROM NEW.col1
   OR OLD.col2 IS DISTINCT FROM NEW.col2
   OR OLD.col3 IS DISTINCT FROM NEW.col3)
EXECUTE procedure update_sessioninfo();

Это просто логическое выражение, которое может включать все столбцы строки.
Однако ваши выражения имеют смысл только для UPDATE, но не для INSERT. Для вставок нет записи OLD. Руководство по CREATE TRIGGER:

condition

Логическое выражение, определяющее, будет ли на самом деле выполняться триггерная функция. Если указано WHEN, функция будет вызываться только в том случае, если condition возвращает true. В триггерах FOR EACH ROW условие WHEN может ссылаться на столбцы старых и/или новых значений строки, записывая OLD.column_name или NEW.column_name соответственно. Конечно, триггеры INSERT не могут ссылаться на OLD, а триггеры DELETE не могут ссылаться на NEW.

И само имя триггера не может быть дополнено схемой. Еще раз цитирую мануал:

name

Имя для нового триггера. Оно должно отличаться от имени любого другого триггера для той же таблицы. Имя не может быть дополнено схемой

Жирный выделение мое.

person Erwin Brandstetter    schedule 21.08.2013

TG_WHEN

текстовый тип данных; строка BEFORE, AFTER или INSTEAD OF, в зависимости от определения триггера.

вот ссылка может использовать

http://www.postgresql.org/docs/9.2/static/plpgsql-trigger.html

person AmirtharajCVijay    schedule 22.08.2013