2013-04-20 3 views
2

У меня есть таблица с несколькими полями и дополнительное поле outofsync. Создал триггер и функцию триггера, чтобы установить значение поля outofsync в значение true перед любым обновлением/вставкой.Обновить поле обновлено триггером

Trigger:

CREATE TRIGGER goods_update_outofsync 
    BEFORE UPDATE 
    ON goods 
    FOR EACH ROW 
    EXECUTE PROCEDURE tg_update_goods_outofsync(); 

функция Trigger:

CREATE OR REPLACE FUNCTION tg_update_goods_outofsync() 
    RETURNS trigger AS 
$BODY$ 
    BEGIN 
    NEW.outofsync=true; 
    RETURN NEW; 
    END; 
    $BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION tg_update_goods_outofsync() 
    OWNER TO postgres; 

А теперь приходит к "простой" вопрос я не могу найти ответ: как обновить вручную outofsync поле ложь, потому что после каждой попытки автоматически сменится на true с помощью триггера.

EDIT:

Это почти работает:

IF (NEW.outofsync = OLD.outofsync) THEN 
    NEW.outofsync=true; 
END IF; 

исключением случаев, когда значение поля outofsync уже ложь, и я хочу, чтобы установить его на ложь, потому что это стало правдой, то ...

Благодарим за помощь!

ответ

4

По крайней мере четыре варианта:

  • Набор для синхронизации в качестве другого пользователя и теста current_user в триггере;

  • Определите пользовательскую конфигурационную переменную (GUC) и SET LOCAL или set_config(...) в транзакции перед обновлением в поле синхронизации; проверить, что GUC в триггере и изменить поведение на его основе;

  • Временное отключение триггера в транзакции перед настройкой синхронизации;

  • Попросите триггер проверить, не изменились ли все остальные значения при обновлении, и разрешить синхронизировать значение true, если другие значения не изменились. Используйте для этого теста IS DISTINCT FROM для удобной обработки нулей.

Я бы, вероятно, использовать пользовательские GUC себя, с current_setting('my.guc'), чтобы получить значение из триггера.

Если вы находитесь на Pg 9.1 или старше, вы должны добавить my (или как вы действительно называете префикс) до custom_variable_classes. В 9.2 и выше любая переменная с периодом (.) в ней считается пользовательской переменной.

См. Также passing user ID to triggers.

+0

Поскольку я не знаком с GUC и у меня много полей в этой таблице (для решения D), я отключу триггер, я думаю. Спасибо! – HoGo

+0

http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/ Я думаю, что я бы скорее отключил все триггеры в текущей сессии, чем один, но глобально. – HoGo

+0

О, вы можете использовать обычную функцию 'set_config' SQL вместо инструкции' SET'. –

Смежные вопросы