Devo tenere traccia delle revisioni dei record in una tabella. Quello che ho fatto è creare una seconda tabella che eredita dal primo e aggiunge un contatore di revisioni.revisioni traccia in postgresql
CREATE TABLE A (
id SERIAL,
foo TEXT,
PRIMARY KEY (id));
CREATE TABLE B (
revision INTEGER NOT NULL) INHERITS (A);
Quindi ho creato un trigger che aggiornava la tabella B ogni volta che A viene inserito/aggiornato. Quello che non riesco a capire è come rendere B.revision mantenere una "sequenza" individuale per ogni id.
Esempio: la tabella A ha 2 righe, i & j.
Sono stato aggiornato 3 volte e dovrebbe avere 3 revisioni: (1, 2, 3).
j è stato aggiornato 2 volte e dovrebbe avere due revisioni: (1, 2).
Ecco quello che ho finora, forse sto scendendo la strada sbagliata e qualcuno può aiutarmi!
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();
Questo ha molto senso. Sarebbe meglio che l'OP cambi i suoi requisiti per fare spazio a questo, perché altrimenti le cose richiederebbero il blocco come si menziona. –
Hrm. E ho appena notato che non mostra le informazioni di revisione effettive. Ho inserito il record su r1 come "bar" e lo ho aggiornato in r3 come "tu", ma i risultati in quest'ultima query mostrano "tu" per entrambe le revisioni. Per risolvere il problema, B non dovrebbe ereditare da A. usare 'LIKE' invece di' INHERITS' per disaccoppiarli: 'CREATE TABLE B (LIKE A, revision serial NOT NULL);'. – theory
Oppure utilizzare la parola chiave "solo". Ma sì, potrebbe essere meno complicato usare solo tabelle separate. –