-
Notifications
You must be signed in to change notification settings - Fork 67
Не работает instead of триггер в представлении для партиционной таблицы #77
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Добрый день!
Вы отчасти правы: триггеры родителя не сработают при вставке строк в партиции. Однако вы можете создать триггеры на партициях, и тогда они будут работать: create function test_trig_func() returns trigger as $$
begin
raise notice 'hi!';
return new;
end;
$$ language plpgsql;
create trigger test_trig
before insert ON test_1 for each row
execute procedure test_trig_func();
explain (analyze, costs off) insert into test values(1, 0);
NOTICE: hi!
QUERY PLAN
-------------------------------------------------------------------------------
Insert on test (actual time=0.191..0.191 rows=0 loops=1)
-> Custom Scan (PartitionFilter) (actual time=0.055..0.056 rows=1 loops=1)
-> Result (actual time=0.001..0.001 rows=1 loops=1)
Planning time: 0.310 ms
Trigger test_trig on test_1: time=0.063 calls=1
Execution time: 0.237 ms
(6 rows) На данный момент сделать "проброс" тригера с родителя на партиции не представляется возможным. В некоторых случаях postgresql получает список триггеров партиции напрямую из каталога, что приводит к неприятным последствиям. |
Спасибо, это я понимаю. Но мне нужно в триггере делать инициализацию первичного ключа значением из sequence, и по этому же полю должно выполняться range партицирование. Кстати, если отключить партицирование: |
Я решил как следует разобраться с вашим примером, и кажется, нашел кое-что интересное. Проблем с UPDATE и DELETE действительно не должно быть. Возможно, это как-то связано с VIEW. Складывается ощущение, что в некоторых случаях дерево запроса обрабатывается не совсем правильно. Я думаю, мы решим эту поблему :) |
Отлично, буду ждать решения! |
Добрый день! На текущий момент этот баг для нас становится критичным и блокирует дальнейшее использование pg_pathman в проекте. |
to @DmitriyAr, Прошу простить за задержку. Скажите, вы используете ванильный postgres или дистрибутив PostgresPro? Мы столкнулись с трудностями при решении проблем с планированием запросов, и на первый взгляд стабильно устранить ее можно только в рамках нашего дистрибутива. Исправление с ходу не заработало, на решение требуется не меньше недели. |
Добрый день! Мы используем стандартный postgres: |
@DmitriyAr, добрый день! Мы, конечно, попытаемся разрешить проблему вызова instead of триггера с ванильным постгресом, однако эта задача будет у нас иметь низкий приоритет. |
Добрый день! Возможно, поможет, в решении проблемы. Найден workaround.
Instead of триггeр будет работать правильно. |
Исправлено в 1.4.2. |
Похоже, проблема все еще есть на 9.5 |
Это наш косяк, тестов хороших не было. Видимо, забыли добавить ваш пример. По крайней мере, больше мы не выкатим сломанный в этом месте релиз :) Обидно, что на 9.6 и выше все работало отлично. Я залил исправление в master, можете проверить? Достаточно просто сделать |
Теперь вроде работает. |
Закрою оба issue когда выкачу новый релиз. |
Выкатил релиз 1.4.7. |
Добрый день!
Мне необходимо использовать триггеры для заполнения некоторых полей перед вставкой / обновлением партиционной таблицы. Обычные триггеры, например, типа BEFORE INSERT FOR EACH ROW, похоже, не работают (ERROR: partitioned column's value should not be NULL) .
Для решения этой проблемы, создаю, представление и вешаю на нее триггер INSTEAD OF INSERT OR UPDATE OR DELETE, в котором генерирую скрипт вставки / обновления / удаления записи из базовой таблицы.
Однако, если таблица партицирована pg_pathman триггер работает только для INSERT. Пример, см. ниже.
Создаю базовую таблицу:
Создаю представление:
CREATE VIEW public.items as SELECT * FROM public._items;
Создаю триггер:
Пробую выполнить операции вставки / обновления / удаления:
пока все ОК, триггер работает для все операций.
Теперь создаю партиции:
SELECT public.create_range_partitions('public._items', 'id', 1, 100000, NULL ,true);
Пробую снова выполнить операции вставки / обновления / удаления:
Триггер теперь срабатывает только для INSERT.
The text was updated successfully, but these errors were encountered: