RowID für Optimistic Logging

Hi zusammen,

ich muss eine Datenbank (Gupta-SQLBase) nach PostgreSQL migrieren und habe folgendes Problem: Die alte Datenbank verwendet eine Sogenannte RowID, die sich mit jedem Update ändert, um optimistic Logging zu realisieren.

Unter PostgreSQL habe ich mir folgendes Vorgehen gedacht:

  • an jede Tabelle Tabelle die Spalte RowID (Als Char(20) anhängen. ok, schon erledigt
  • Eine Sequence anlegen. OK
  • Dann einen Trigger auf jede Tabelle setzen, der bei jedem Update den Wert in RowID auf den neuen Wert der Sequence setzt
    Soweit eigentlich auch klar, aber ich kriege die Funktion (in SQL) nicht hin. Leider habe ich auch kein Beispiel gefunden. Woher weiss die Funktion, aus welcher Tabelle sie aufgerufen wird, wenn ich keine Paramater mitgeben kann, brauche ich für jede Tabelle eine eigene Funktion :frowning:

Wäre prime wenn mir jemand weiterhelfen kann, oder sogar eine bessere Idee hat.

Danke

JSP

sorry, es heisst natürlich optimistic Locking
Wenn die Finger wieder schneller als das Hirn sind :wink:

JSP

Hallo,

keine Funktion weiß woher sie aufgerufen wird!

Du brauchst nur den Namen der Tabelle als Parameter der Funktion übergeben. Beispiel

CREATE OR REPLACE FUNCTION ... (nameTable name)
  RETURNS void
...

Der Name der Tabelle wird bei der Definition des Trigger festgelegt.



mfg

fristo

Hi zusammen, inzwischen habe ich die Lösung doch noch hinbekommen

Hier die Lösung, wenn Sie auch für andere interessant ist:

– Erst mal die Sequence anlegen
CREATE SEQUENCE sysadm.seq_rowid
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 100
CACHE 1;
ALTER TABLE sysadm.seq_rowid OWNER TO postgres;

COMMENT ON SEQUENCE sysadm.seq_rowid IS ‘Trigger für die interne RowID Verwaltung’;

– Dann die Triggerfunktion, die gar keinen Tabellennamen braucht
CREATE OR REPLACE FUNCTION sysadm.UpdateRowID() RETURNS trigger AS $emp_stamp$
Begin
New.RowID := nextval( ‘sysadm.seq_rowid’);
Return new;
End;
$emp_stamp$ LANGUAGE ‘plpgsql’ VOLATILE;
ALTER FUNCTION sysadm.UpdateRowID() OWNER TO sysadm;

– Und ein Beispieltrigger
create Trigger tr_time_Rowid Before Insert or Update on sysadm.User
For Each Row Execute Procedure sysadm.UpdateRowID();

Danke auch für den Tip oben, werde ich sicher noch brauchen

Gruss JSP