Tengo que hacer un seguimiento de las revisiones de los registros en una tabla. Lo que hice fue crear una segunda tabla que hereda de la primera y agrega un contador de revisión.revisar las revisiones en postgresql
CREATE TABLE A (
id SERIAL,
foo TEXT,
PRIMARY KEY (id));
CREATE TABLE B (
revision INTEGER NOT NULL) INHERITS (A);
Luego creé un disparador que actualizaría la tabla B cada vez que se inserta o actualiza A. Lo que no puedo entender es cómo hacer que B.revision mantenga una "secuencia" individual para cada identificación.
Ejemplo: la tabla A tiene 2 filas, i & j.
i ha sido actualizado 3 veces y debe tener 3 revisiones: (1, 2, 3).
j se ha actualizado 2 veces y debe tener dos revisiones: (1, 2).
Esto es lo que tengo hasta ahora, ¡tal vez estoy tomando el camino equivocado y alguien puede ayudarme!
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();
Esto tiene mucho sentido. Sería mejor que el OP cambie sus requisitos para hacer espacio para esto, porque de otra manera las cosas requerirían bloqueo como usted menciona. –
Hrm. Y acabo de notar que no muestra la información de revisión real. Inserté el registro en r1 como "barra" y lo actualicé en r3 como "usted", pero los resultados en esa última consulta muestran "usted" para ambas revisiones. Para solucionar eso, B no debe heredar de A. use 'LIKE' en lugar de' INHERITS' para desacoplarlos: 'CREATE TABLE B (LIKE A, revisión serial NOT NULL);'. – theory
O use la palabra clave "only". Pero sí, podría ser menos confuso usar tablas separadas. –