powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проверка изменено ли поле в триггере.
13 сообщений из 13, страница 1 из 1
Проверка изменено ли поле в триггере.
    #40065026
Добрый день.

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

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

Код: sql
1.
IF OLD.col IS NOT DISTINCT FROM NEW.col THEN



Но в таблице есть геометрические поля, то есть одно поле тронули, а проверять нужно будет все!
...
Рейтинг: 0 / 0
Проверка изменено ли поле в триггере.
    #40065087
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Под изменением Вы понимаете, внесение нового значения в поле или упоминание в UPDATE?

Если первое
Код: sql
1.
IF OLD.col != NEW.col
...
Рейтинг: 0 / 0
Проверка изменено ли поле в триггере.
    #40065098
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guzya
Под изменением Вы понимаете, внесение нового значения в поле или упоминание в UPDATE?

Если первое
Код: sql
1.
IF OLD.col != NEW.col



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

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

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Проверка изменено ли поле в триггере.
    #40065177
Maxim Boguk,

Задача написания триггера истории. То есть если какое то поле поменялось, куда то пишется старое и новое значение.
На сколько будет эффективно DISTINCT FROM для больших объёмов данных?
Например в таблице 100500 полей, обновляем только одно, но в триггере будет DISTINCT FROM на все поля! В том числе большого объёма.
Если бы можно было, например как в Oracle или MS SQL проверить через IF UPDATING()?
...
Рейтинг: 0 / 0
Проверка изменено ли поле в триггере.
    #40065326
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Григорий Поверенный
Maxim Boguk,

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


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

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Проверка изменено ли поле в триггере.
    #40065555
Maxim Boguk,

список измененных полей, а точнее на какими полями происходили действия. Пример в других СУБД приведён выше.
...
Рейтинг: 0 / 0
Проверка изменено ли поле в триггере.
    #40065564
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Григорий Поверенный
Maxim Boguk,

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


пример в других субд ничего на этом форуме никому почти не говорит...
можно вот так вот сделать через jsonb
Код: sql
1.
2.
3.
4.
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 сделать
Код: sql
1.
changes := hstore(NEW) - hstore(OLD);



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

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Проверка изменено ли поле в триггере.
    #40065587
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Григорий Поверенный
Пример в других СУБД приведён выше.

Другие СУБД не пользуются магией, так что они просто спрятали IS DISTINCT под капот функции. Быстродействие от этого не увеличилось.
...
Рейтинг: 0 / 0
Проверка изменено ли поле в триггере.
    #40068493
Dimitry Sibiryakov
Другие СУБД не пользуются магией

Если так то нет вопросов. Но тогда бы при обновлении поля на то же значение в других СУБД проверка IF UPDATING() давала бы отрицательное значение, но это не так. То есть СУБД даёт информацию, над какими полями производились действия.
...
Рейтинг: 0 / 0
Проверка изменено ли поле в триггере.
    #40068569
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или, что вероятнее, какие поля были упомянуты в запросе UPDATE. Это ты, как написавший запрос, можешь выяснить и без триггера.
...
Рейтинг: 0 / 0
Проверка изменено ли поле в триггере.
    #40069249
Dimitry Sibiryakov
можешь выяснить и без триггера.


Так это и нужно сделать внутри триггера... в общем на нет и суда нет.
...
Рейтинг: 0 / 0
Проверка изменено ли поле в триггере.
    #40069283
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Или, что вероятнее, какие поля были упомянуты в запросе UPDATE. Это ты, как написавший запрос, можешь выяснить и без триггера.


Учитывая что 90% кода поверх ОРМ работают, а ORM в UPDATE перечисляет всегда все поля таблицы... то особого смысла в этой задаче я не вижу.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Проверка изменено ли поле в триггере.
    #40069349
Maxim Boguk,

У нас не так. У нас вообще нет такого.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проверка изменено ли поле в триггере.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]