Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / партицирование. ругается на тригер update before / 5 сообщений из 5, страница 1 из 1
30.05.2016, 11:45
    #39246059
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
партицирование. ругается на тригер update before
ситуация такая: таблица а разбита на кучу партиций
работает так: при инсерте определяем в какую пачку записать

при апдейте удаляем OLD инсертим NEW (тут срабатывает тригер инсерт, вдруг по новым условиям запись должна физически перенестись в другую пачку)


такой запрос ругается из шедуллера:
Код: sql
1.
2.
3.
4.
with u1 as (update from a set a=1 where ... retirning *),
u2 as (update from a set a=2 where ... retirning *),
...
select 0 as error

-- все лишнее из запроса поудалял оставил, то что создает ошибку:
ERROR: tuple to be updated was already modified by an operation triggered by the current command
Подсказка: Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows.

вопрос: можно ли тригерр на UPDATE переместить в AFTER ?
или может есть способ как в запросе избежать такой ошибки?
...
Рейтинг: 0 / 0
30.05.2016, 11:55
    #39246074
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
партицирование. ругается на тригер update before
Legushka,

всегда используйте тригеры AFTER, кроме тех случаев когда необходим имменно BEFORE. если в данном случае не расчитываются данные для NOT NULL полей и т.п. переделывайте на AFTER.
...
Рейтинг: 0 / 0
30.05.2016, 12:17
    #39246100
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
партицирование. ругается на тригер update before
Lonepsycho,

рекомендация спорная. особо -- в свете того, что в before логике события худо--бедно упорядочены, а в after -- "просто пипетс какойта" (где--то тут в форуме есть темка на предмет измерения очередности событий в after, и цитируется жевание соплей небезызвестным супергурьем томом лейном на эту тему) 111

но ясный--красный: -- если вы хотите пользоваться returning -- вам ничего не остается как пользоваться after логикой в триггерах партицирования. как во вставке, так и в обновлении.

PS я до сих пор не понял, чревато ли это лишними дисковыми, т.е. какие накладные на цепочку--"инсерт в предка--делете фром онли предок--инсерт в дитё".
...
Рейтинг: 0 / 0
30.05.2016, 12:34
    #39246113
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
партицирование. ругается на тригер update before
qwwq подскажите а если в запросе просто убрать все returning то логика тригерров с before сработает?
для чего делалось все в одном with:
просто изначально для всех апдейтов используются практически одни и теже таблицы, многие из них тяжелые
я предположил что если все загнать в один with запрос то к исходным таблицам можно обратиться один раз и загнать их в память

returning * делался на каждом шаге только для проверки
...
Рейтинг: 0 / 0
30.05.2016, 13:18
    #39246151
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
партицирование. ругается на тригер update before
Legushka,

Я думаю, что вы попадаете в случай, когда запись не двигается и два подзапроса пытаются менять одну и ту же запись, о чём и говорит ошибка.
Для перещения записей AFTER точно не подойдёт -- всё уже случилось и перенаправить в другую таблицу вы не сможете.

Я бы рекомендовал отойти от столь сложных запросов. Либо встраивайте такую логику в PL/pgSQL функции IF-блоками.
Либо совсем откажитесь от миграции записей, т.е. EXCEPTION в случае NEW.key_col IS DISTINCT FROM OLD.key_col.

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


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