RowID für Optimistic Logging

Probleme und Fragen zum Thema Trigger und Funktionen.

RowID für Optimistic Logging

Beitragvon JSpatz » Fr 19. Mai 2006, 14:08

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 :-(

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

Danke

JSP
JSpatz
Benutzer
 
Beiträge: 58
Registriert: Fr 19. Mai 2006, 13:58

sorry, es heisst natürlich optimistic Locking

Beitragvon JSpatz » Fr 19. Mai 2006, 14:13

sorry, es heisst natürlich optimistic Locking
Wenn die Finger wieder schneller als das Hirn sind ;-)

JSP
JSpatz
Benutzer
 
Beiträge: 58
Registriert: Fr 19. Mai 2006, 13:58

Beitragvon fristo » Fr 19. Mai 2006, 15:53

Hallo,

keine Funktion weiß woher sie aufgerufen wird!

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

Code: Alles auswählen
CREATE OR REPLACE FUNCTION ... (nameTable name)
  RETURNS void
...


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



mfg

fristo
fristo
Erfahrener Benutzer
 
Beiträge: 670
Registriert: Do 8. Dez 2005, 13:30
Wohnort: Raum Frankfurt/Main

Lösung

Beitragvon JSpatz » Mo 22. Mai 2006, 09:06

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
JSpatz
Benutzer
 
Beiträge: 58
Registriert: Fr 19. Mai 2006, 13:58


Zurück zu Trigger und Funktionen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron