Ã?nderungen protokollieren (PostgreSQL/Trigger)

MySQL, PostgreSQL, SQLite
phisch
Userprojekt
Userprojekt
Posts: 41
Joined: 2002-06-07 17:45
Location: Flagstaff

Ã?nderungen protokollieren (PostgreSQL/Trigger)

Post by phisch » 2003-06-22 10:23

Hallo zusammen,

In einer Datenbank habe ich eine Tabelle, bei der ich alle Ã?nderungen mitloggen muss. Da man unterschiedlich auf die Datenbank zugreifen kann (Web, Batch...), will ich das Loggen direkt in der Datenbank machen und nicht einem externen Programm überlassen.

Meine Tabelle sieht in etwa so aus:
card_holder(foo, bar, last_changed, last_changed_by);
last_changed_by hält den Benutzernamen der Person, die an der Software angemeldet ist; dieser Login ist aber != Postgresuser. Und genau das ist mein Problem.

Meine Logtabelle (card_holder_history) ist identisch mit card_holder und hat zusätzlich noch ein Feld Action.
Mein Trigger reagiert auf INSERT, UPDATE und DELETE. Bei INSERT und UPDATE funktioniert auch alles bestens, Action wird mit INSERT bzw. UPDATE belegt und die restlichen Daten dann identisch in beide Tabellen eingetragen.

Wenn ich aber jetzt ein DELETE absetzte habe ich das Problem, dass ja bei DELETE das Feld last_changed_by (=Username) nicht belegt ist (last_changed ist einfach die Systemzeit) und somit der Trigger nicht funktioniert.

Langer Reder kurzer Sinn.

Wie kann ich mit obiger Konstellation auch beim Löschen den Benutzernamen in die Logtabelle eintragen?
Es sollte also so eine Zeile in die History eingetragen werden:
card_holder_history(NULL,NULL,'2003-06-22 10:22', 'phisch', 'DELETE');

Oder gibt es vielleicht andere/bessere Ansätze, um derartiges Loggen zu machen?

Danke schonmal.

phisch

olaf.dietsche
Posts: 401
Joined: 2002-12-19 02:06
Location: Siegburg

Re: Ã?nderungen protokollieren (PostgreSQL/Trigger)

Post by olaf.dietsche » 2003-06-22 12:21

phisch wrote:In einer Datenbank habe ich eine Tabelle, bei der ich alle Ã?nderungen mitloggen muss. Da man unterschiedlich auf die Datenbank zugreifen kann (Web, Batch...), will ich das Loggen direkt in der Datenbank machen und nicht einem externen Programm überlassen.
...
Wie kann ich mit obiger Konstellation auch beim Löschen den Benutzernamen in die Logtabelle eintragen?
Es sollte also so eine Zeile in die History eingetragen werden:
card_holder_history(NULL,NULL,'2003-06-22 10:22', 'phisch', 'DELETE');
Vielleicht hilft dir ja einer von diesen Links weiter:
http://archives.postgresql.org/pgsql-sq ... g00025.php
http://jamesthornton.com/postgres/7.3/p ... ation.html

phisch
Userprojekt
Userprojekt
Posts: 41
Joined: 2002-06-07 17:45
Location: Flagstaff

Re: Ã?nderungen protokollieren (PostgreSQL/Trigger)

Post by phisch » 2003-06-22 13:16

Klingt alles gut, aber es wird immer davon ausgegangen, dass man an den angemeldeten PostgresUser rankommen will.

Mein Problem ist aber, dass die Entscheidung, ob der User darf, aufgrund einer LDAP Anfrage _vorher_ fällt und dann wird die Verbindung entweder mit einem privilegierten Postgresuser oder mit einem nicht priv. User aufgebaut.

Letzendlich will ich einfach einen varchar der DELETE Funktion übergeben, der eben zufällig einen Usernamen entspricht.

Kann ich beim Connect eine Variable setzen, die ich dann in der Funktion meines Triggers wieder auslese?

Danke.

phisch

olaf.dietsche
Posts: 401
Joined: 2002-12-19 02:06
Location: Siegburg

Re: Ã?nderungen protokollieren (PostgreSQL/Trigger)

Post by olaf.dietsche » 2003-06-22 13:29

phisch wrote:Klingt alles gut, aber es wird immer davon ausgegangen, dass man an den angemeldeten PostgresUser rankommen will.

Mein Problem ist aber, dass die Entscheidung, ob der User darf, aufgrund einer LDAP Anfrage _vorher_ fällt und dann wird die Verbindung entweder mit einem privilegierten Postgresuser oder mit einem nicht priv. User aufgebaut.

Letzendlich will ich einfach einen varchar der DELETE Funktion übergeben, der eben zufällig einen Usernamen entspricht.

Kann ich beim Connect eine Variable setzen, die ich dann in der Funktion meines Triggers wieder auslese?
So gut kenne ich mich mit Postgres nicht aus, ich habe nur ein bischen gegoogelt. Aber man kann die Aktion auch abbrechen, indem man einen NULL Pointer aus der Triggerfunktion zurück liefert: http://developer.postgresql.org/docs/po ... ggers.html

D.h. du kannst deine Entscheidung bis zum ersten Aufruf verschieben.