Мне нужно отслеживать изменения записей в таблице. То, что я сделал, это создать вторую таблицу, которая наследуется от первой и добавляет счетчик ревизий.отслеживание изменений в postgresql
CREATE TABLE A (
id SERIAL,
foo TEXT,
PRIMARY KEY (id));
CREATE TABLE B (
revision INTEGER NOT NULL) INHERITS (A);
Затем я создал триггер, который будет обновлять таблицу B каждый раз, когда вставлен/обновлен A. Что я не могу понять, так это то, как заставить B.revision сохранять индивидуальную «последовательность» для каждого идентификатора.
Пример: таблица A имеет 2 строки, i & j.
i был обновлен 3 раз и должен иметь 3 ревизии: (1, 2, 3).
j был обновлен 2 раз и должен иметь две модификации: (1, 2).
Вот что у меня есть до сих пор, может быть, я иду по неправильному пути, и кто-то может мне помочь!
CREATE OR REPLACE FUNCTION table_update() RETURNS TRIGGER AS $table_update$
DECLARE
last_revision INTEGER;
BEGIN
SELECT INTO last_revision MAX(revision) FROM B WHERE id = NEW.id;
IF NOT FOUND THEN
last_revision := 0;
END IF;
INSERT INTO B SELECT NEW.*;
RETURN NEW;
END;
$table_update$ LANGUAGE plpgsql;
CREATE TRIGGER table_update
AFTER INSERT OR UPDATE ON A
FOR EACH ROW EXECUTE PROCEDURE table_update();
Это имеет смысл. Было бы лучше, если бы ОП изменил его требования, чтобы освободить место для этого, потому что иначе все будет требовать блокировки, как вы упомянули. –
Hrm. И я только заметил, что он не отображает фактическую информацию о пересмотре. Я вставил запись в r1 как «bar» и обновил ее в r3 как «вы», но результаты этого последнего запроса показывают «вы» для обеих версий. Чтобы исправить это, B не должен наследовать от A. используйте 'LIKE' вместо' INHERITS', чтобы отделить их: 'CREATE TABLE B (LIKE A, серийный выпуск NOT NULL);'. – theory
Или используйте ключевое слово «только». Но да, возможно, было бы немного запутать просто использование отдельных таблиц. –