PostgreSQL: установите две метки времени равными друг другу. С одним из них связан триггер - PullRequest
0 голосов
/ 10 января 2019

Предположим, у вас есть table с двумя полями timestamptz, created и updated.

table имеет триггер, подобный следующему:

CREATE TRIGGER trig_table_on_update
BEFORE UPDATE ON table
FOR EACH ROW EXECUTE PROCEDURE func_table_on_update();

func_table_on_update определяется следующим образом:

CREATE OR REPLACE FUNCTION func_table_on_update()
RETURNS trigger AS
$$
BEGIN
    NEW.updated = current_timestamp;
    RETURN NEW;
END;
$$

Как я могу установить created := updated из другой функции? Проблема в том, что created устанавливается в OLD.updated, а затем при фиксации OLD.updated перезаписывается current_timestamp. Мне нужно поддерживать равенство между двумя после коммита, но они не могут всегда быть установлены в одно и то же время.

Например,

Исходное состояние:

created            |updated            |
-------------------|-------------------|
2018-10-09 15:59:23|2018-11-12 16:00:22|

После обновления:

created            |updated            |
-------------------|-------------------|
2018-11-12 16:00:22|2019-01-09 16:00:22|

Желаемое состояние:

created            |updated            |
-------------------|-------------------|
2018-11-12 16:00:22|2018-11-12 16:00:22|

1 Ответ

0 голосов
/ 10 января 2019

Триггер должен быть определен с условием:

CREATE TRIGGER trig_table_on_update
BEFORE UPDATE ON my_table
FOR EACH ROW 
WHEN (NEW.created = OLD.created)
EXECUTE PROCEDURE func_table_on_update();

Также добавьте оператор в функцию триггера:

    NEW.created = OLD.updated;

Теперь транзакция может выглядеть так:

BEGIN;

UPDATE my_table
SET some_column = 'new value'
-- don't set created here!
WHERE id = 1;

SELECT *
FROM my_table;
-- here created <> updated

UPDATE my_table
SET created = updated
WHERE id = 1;
-- the trigger won't be fired

SELECT *
FROM my_table;
-- here created = updated

COMMIT;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...