Сравнение NEW и OLD в тригере по всем колонкам но без одной определенной колонки.

maloii
Дата: 03.02.2015 14:44:16
Подскажите простой и быстрый способ сравнения NEW и OLD в тригере по всем колонкам но без одной определенной колонки, БЕЗ перечисления всех колонок, а только указывая которую не надо сравнивать. В интернете нашел хорошие способы но там надо перечислять колонки по которым надо сравнивать. У меня же тригер универсальный для всех таблиц, но есть 1 колонка во всех таблицах по которой не надо сравнивать.
IF ROW(NEW.*) IS DISTINCT FROM ROW(OLD.*) THEN
  -- continue only if some is changed
  IF NEW.a1 IS DISTINCT FROM OLD.a1 
     OR NEW.a2 IS DISTINCT FROM OLD.a2 THEN
     -- continue only if important columns are changed
     ...
  END IF;
END IF;
RETURN NEW;

IF ROW(NEW.a1, NEW.a2) IS DISTINCT FROM ROW(OLD.a1, OLD.a2) THEN
  -- important columns are changed
  ...
END IF;
RETURN NEW;
Maxim Boguk
Дата: 03.02.2015 14:53:20
maloii
Подскажите простой и быстрый способ сравнения NEW и OLD в тригере по всем колонкам но без одной определенной колонки, БЕЗ перечисления всех колонок, а только указывая которую не надо сравнивать. В интернете нашел хорошие способы но там надо перечислять колонки по которым надо сравнивать. У меня же тригер универсальный для всех таблиц, но есть 1 колонка во всех таблицах по которой не надо сравнивать.
IF ROW(NEW.*) IS DISTINCT FROM ROW(OLD.*) THEN
  -- continue only if some is changed
  IF NEW.a1 IS DISTINCT FROM OLD.a1 
     OR NEW.a2 IS DISTINCT FROM OLD.a2 THEN
     -- continue only if important columns are changed
     ...
  END IF;
END IF;
RETURN NEW;

IF ROW(NEW.a1, NEW.a2) IS DISTINCT FROM ROW(OLD.a1, OLD.a2) THEN
  -- important columns are changed
  ...
END IF;
RETURN NEW;


а название этой колонки оно одинаковое кругом?
тогда перед сравнением сделайте OLD.fieldname=NEW.fieldname
и дальше как вы написали выше.

--Maxim Boguk
www.postgresql-consulting.ru
maloii
Дата: 03.02.2015 15:15:10
Maxim Boguk,

Назначение колонки, это время обновления. Но Ваша идея супер, спасибо!
NikolayV81
Дата: 03.02.2015 16:59:22
Maxim Boguk
...
тогда перед сравнением сделайте OLD.fieldname=NEW.fieldname
и дальше как вы написали выше.


А не приведёт в будущем к проблемам ( OLD. с точки зрения логики должны быть константами )?
Maxim Boguk
Дата: 03.02.2015 18:03:51
NikolayV81
Maxim Boguk
...
тогда перед сравнением сделайте OLD.fieldname=NEW.fieldname
и дальше как вы написали выше.


А не приведёт в будущем к проблемам ( OLD. с точки зрения логики должны быть константами )?


вопрос хороший... но в общем как таковых readonly констант в pl/pgsql нет...
это просто row как row...
можно в другой row скопировать и там обновить.