Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Проверка изменено ли поле в триггере.  [new]
Григорий Поверенный
Member

Откуда:
Сообщений: 109
Добрый день.

Перелопатил всю документацию и не нашёл функции проверки в триггере, изменено ли поле, по типу IF UPDATING() из Oracle.

Один вариант пока только если

IF OLD.col IS NOT DISTINCT FROM NEW.col THEN


Но в таблице есть геометрические поля, то есть одно поле тронули, а проверять нужно будет все!
23 апр 21, 08:27    [22312928]     Ответить | Цитировать Сообщить модератору
 Re: Проверка изменено ли поле в триггере.  [new]
Guzya
Member

Откуда:
Сообщений: 720
Под изменением Вы понимаете, внесение нового значения в поле или упоминание в UPDATE?

Если первое
IF OLD.col != NEW.col
23 апр 21, 10:34    [22313006]     Ответить | Цитировать Сообщить модератору
 Re: Проверка изменено ли поле в триггере.  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4719
Guzya
Под изменением Вы понимаете, внесение нового значения в поле или упоминание в UPDATE?

Если первое
IF OLD.col != NEW.col


И это неверно... ( NULL != NULL ) = NULL = false
надо таки через IS NOT DISTINCT сверять...

но вопрос а что автор топика спрашивает... я не до конца понял что требуется и в чем проблема.
и главное какую задачу решаем.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru

Сообщение было отредактировано: 23 апр 21, 12:24
23 апр 21, 10:50    [22313020]     Ответить | Цитировать Сообщить модератору
 Re: Проверка изменено ли поле в триггере.  [new]
Григорий Поверенный
Member

Откуда:
Сообщений: 109
Maxim Boguk,

Задача написания триггера истории. То есть если какое то поле поменялось, куда то пишется старое и новое значение.
На сколько будет эффективно DISTINCT FROM для больших объёмов данных?
Например в таблице 100500 полей, обновляем только одно, но в триггере будет DISTINCT FROM на все поля! В том числе большого объёма.
Если бы можно было, например как в Oracle или MS SQL проверить через IF UPDATING()?
23 апр 21, 13:16    [22313149]     Ответить | Цитировать Сообщить модератору
 Re: Проверка изменено ли поле в триггере.  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4719
Григорий Поверенный
Maxim Boguk,

Задача написания триггера истории. То есть если какое то поле поменялось, куда то пишется старое и новое значение.
На сколько будет эффективно DISTINCT FROM для больших объёмов данных?
Например в таблице 100500 полей, обновляем только одно, но в триггере будет DISTINCT FROM на все поля! В том числе большого объёма.
Если бы можно было, например как в Oracle или MS SQL проверить через IF UPDATING()?


Вам надо узнать список измененных полей или просто факт что что то вообще было изменено (без разницы что)?
(это две разные задачи)

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
23 апр 21, 18:31    [22313372]     Ответить | Цитировать Сообщить модератору
 Re: Проверка изменено ли поле в триггере.  [new]
Григорий Поверенный
Member

Откуда:
Сообщений: 109
Maxim Boguk,

список измененных полей, а точнее на какими полями происходили действия. Пример в других СУБД приведён выше.
25 апр 21, 09:31    [22313842]     Ответить | Цитировать Сообщить модератору
 Re: Проверка изменено ли поле в триггере.  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4719
Григорий Поверенный
Maxim Boguk,

список измененных полей, а точнее на какими полями происходили действия. Пример в других СУБД приведён выше.


пример в других субд ничего на этом форуме никому почти не говорит...
можно вот так вот сделать через jsonb
SELECT pre.key AS columname, pre.value AS prevalue, post.value AS postvalue
FROM jsonb_each(to_jsonb(OLD)) AS pre
CROSS JOIN jsonb_each(to_json(NEW)) AS post
WHERE pre.key = post.key AND pre.value IS DISTINCT FROM post.value


можно что то похожее через hstore сделать
changes := hstore(NEW) - hstore(OLD);


PS: надо понимать таки что это именно список реально измененных полей
т.е. update ... set f1=1 where...; если f1 уже равен 1 в таблице - даст пустой результат так как не изменилось ничего в реальности.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
25 апр 21, 10:42    [22313859]     Ответить | Цитировать Сообщить модератору
 Re: Проверка изменено ли поле в триггере.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53070
Григорий Поверенный
Пример в других СУБД приведён выше.

Другие СУБД не пользуются магией, так что они просто спрятали IS DISTINCT под капот функции. Быстродействие от этого не увеличилось.
25 апр 21, 13:44    [22313909]     Ответить | Цитировать Сообщить модератору
 Re: Проверка изменено ли поле в триггере.  [new]
Григорий Поверенный
Member

Откуда:
Сообщений: 109
Dimitry Sibiryakov
Другие СУБД не пользуются магией

Если так то нет вопросов. Но тогда бы при обновлении поля на то же значение в других СУБД проверка IF UPDATING() давала бы отрицательное значение, но это не так. То есть СУБД даёт информацию, над какими полями производились действия.

Сообщение было отредактировано: 5 май 21, 09:33
5 май 21, 09:38    [22318624]     Ответить | Цитировать Сообщить модератору
 Re: Проверка изменено ли поле в триггере.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53070
Или, что вероятнее, какие поля были упомянуты в запросе UPDATE. Это ты, как написавший запрос, можешь выяснить и без триггера.
5 май 21, 14:09    [22318770]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить