2016-12-26 1 views
0

У меня есть веб-приложение с полем modified в важных таблицах, чтобы иметь возможность отслеживать, когда была произведена какая-либо модификация. (Не говоря уже о ;; она есть, потому что это Postgres SQL-код выполняется из рамок Scala, который использует ; в качестве разделителя и ;; сбегает его)Триггер Postgres, который в любом случае установит значение при модификации?

CREATE TABLE security_permission (
    id BIGSERIAL, 
    value VARCHAR(255) NOT NULL, 
    modified TIMESTAMP DEFAULT now(), 
    PRIMARY KEY (id) 
); 

CREATE OR REPLACE FUNCTION update_modified() 
RETURNS TRIGGER AS $$ 
BEGIN 
    NEW.modified = now();; 
    RETURN NEW;; 
END;; 
$$ language 'plpgsql'; 

CREATE TRIGGER update_modified_security_permission BEFORE UPDATE ON security_permission FOR EACH ROW EXECUTE PROCEDURE update_modified(); 

Проблема заключается в том что это работает только если поле не указано в инструкции вставки/обновления. Если поле задано даже с NULL, то измененное не задано. Я не имею полного контроля над сгенерированными операторами, потому что они являются частью структуры ORM, которая их генерирует автоматически, но я все же всегда хочу установить измененное поле. Как я могу это сделать?

Я попытался использовать BEFORE INSERT OR UPDATE ON и AFTER INSERT OR UPDATE ON, но ничего не работает, если поле заполнено в инструкции insert/update, даже если NULL. Как я могу это сделать?

+2

Определите триггер 'перед обновлением или insert'. [См. Рабочий пример здесь.] (Http://rextester.com/GTROVA13573) – klin

+0

Можете ли вы ответить на этот вопрос? это отличное спасибо! –

ответ

1

Определите триггер before update or insert:

CREATE TRIGGER update_modified_security_permission 
BEFORE UPDATE OR INSERT ON security_permission 
FOR EACH ROW EXECUTE PROCEDURE update_modified(); 

See a working example here.

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