Tablodaki kayıtların revizyonlarını takip etmeliyim. Yaptığım şey, ilkinden devralınan ve bir revizyon sayacı ekleyen ikinci bir tablo oluşturmak.postgresql'deki revizyonları izleme
CREATE TABLE A (
id SERIAL,
foo TEXT,
PRIMARY KEY (id));
CREATE TABLE B (
revision INTEGER NOT NULL) INHERITS (A);
Ardından, A her eklendiğinde/güncellendiğinde, B tablosunu güncelleyen bir tetikleyici oluşturdum. Anlayamadığım şey, B.revision'un her bir kimlik için bir "sıra" tutmasını nasıl sağlamanız gerektiğidir.
Örnek: A tablosunun 2 satırı vardır, i & j.
i 3 kez güncellendi ve 3 düzeltmesi olmalı: (1, 2, 3).
j 2 defa güncellendi ve iki kez düzeltme yapılıyor: (1, 2).
Şimdiye kadar sahip olduğum şey, belki yanlış yoldan aşağı iniyorum ve birisi bana yardım edebilir!
CREATE OR REPLACE FUNCTION table_update() RETURNS TRIGGER AS $table_update$
DECLARE
last_revision INTEGER;
BEGIN
SELECT INTO last_revision coalesce(MAX(revision), 0) FROM B WHERE id = NEW.id;
INSERT INTO B SELECT NEW.*, last_revision + 1;
RETURN NEW;
END;
$table_update$ LANGUAGE plpgsql;
Değiştim bir COALESCE içine "bulunamadı eğer" hayır mevcut revizyon varsa o "0" bulacaktır:
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();
Bu çok anlam ifade ediyor. En iyisi OP'nin gerekliliklerini değiştirmek için gerekliliklerini değiştirmesidir, çünkü başka şeylerin bahsettiğiniz gibi kilitlenmesi gerekir. –
Hrm. Ve sadece gerçek revizyon bilgilerini göstermediğini fark ettim. R1'deki rekoru "bar" olarak ekledim ve r3'te "siz" olarak güncelledim, ancak bu son sorgudaki sonuçlar her iki revizyon için "siz" i gösteriyor. Bunu düzeltmek için B, B'den miras almamalı ve “DAHA FAZLA” yerine “LASE” yi kullanmalıdır: “CREABLE TABLE B (LIKE A, revizyon seri NOT NULL); – theory
Veya "yalnızca" anahtar sözcüğünü kullanın. Ama evet, ayrı tabloları kullanmak daha az kafa karıştırıcı olabilir. –