Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> prevent trigger recursion 
V
    Опции темы
goodday1941
Дата 10.12.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: нет
Всего: 9



у меня есть триггер который вызывается при INSERT/UPDATE и при этом апдейтит ту же таблицу (: и естественно входит в рекурсию

как этого избежать (пс, апдейтить таблицу приходится при любых раскладах)

может есть возможность как то сказать триггеру что при апдейте той то колонки ничего не делать?


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
LSD
Дата 11.12.2009, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 3
Всего: 538



Тебе надо изменять ту же строку для которой был вызван триггер, или другую?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
goodday1941
Дата 11.12.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: нет
Всего: 9



ту же

Добавлено через 6 минут и 12 секунд
в двух словах опишу задачку, есть таблица с какими то данными, и нужно сделать по некоторым ее колонкам релевантный текстовый поиск (благо постгрес это умеет делать), собсно добавляю я туда еще одну колонку с tsvector'ом, в котором храню нужную мне инфу, но вот беда, его нужно держать так сказать up to date ) для этого решил использовать триггер, но собсно этот триггер пока у меня уходит в рекурсию :(

проблема еще усугубляется тем что в таблице есть форинкеи на внешние таблицы с которых нужно вынемать инфу для формирования tsvector'а

может есть другие способы решения моей проблемы? я еще смотрел в сторону вьюхи, но я так понял она формируеться каждый раз когда идет запрос к ней, а это мне не подходит, колличество данных может быть относительно большим (до 1кк записей)


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
goodday1941
Дата 11.12.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: нет
Всего: 9



пока сделал проверку на то что строки не обновились

что то по типу

Код

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

тоесть если определенные строки имеют то же значение после апдейто то ничего не делаем 


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
LSD
Дата 11.12.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 3
Всего: 538



Цитата(goodday1941 @  11.12.2009,  12:04 Найти цитируемый пост)
ту же

Ну так зачем вообще, весь этот огород с INSERT/UPDATE. Просто создай тригер BEFORE и меняй NEW значения. Типа как тут с полями current_timestamp и current_user:
Код

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
        -- Check that empname and salary are given
        IF NEW.empname IS NULL THEN
            RAISE EXCEPTION 'empname cannot be null';
        END IF;
        IF NEW.salary IS NULL THEN
            RAISE EXCEPTION '% cannot have null salary', NEW.empname;
        END IF;

        -- Who works for us when she must pay for it?
        IF NEW.salary < 0 THEN
            RAISE EXCEPTION '% cannot have a negative salary', NEW.empname;
        END IF;

        -- Remember who changed the payroll when
        NEW.last_date := current_timestamp;
        NEW.last_user := current_user;
        RETURN NEW;
    END;
$emp_stamp$ LANGUAGE plpgsql;




--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
goodday1941
Дата 14.12.2009, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: нет
Всего: 9



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

но решение которое я писал выше мне очень даже подошло, в рекурсию не входим, скорость выполнения тоже удовлетворяет


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PostgreSQL | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.