Userkontext / Variablen

Hallo,

gibt es eine Möglichkeit Benutzerkontext"variablen" auf DBMS Ebene zu definieren und abzufragen, ohne dass man diese in einer Tabelle ablegen und von dort immer wieder einlesen muss?

Hintergrund: Eine Anwendung kann Mehrsprachigkeit unterstützen, aber ein Anwender hat immer genau ein Sprache, die ihm zugewiesen ist. Oder in einer mandantenfähigen Anwendung gibt es zwar mehrere Mandanten, aber ein Benutzer ist immer nur in einem Mandanten angemeldet.

Ich könnte zwar eine Tabelle definieren und diese Daten dort ablegen, aber dann müsste ich z.B. die Sprache, obwohl diese sich nicht ändert, immer wieder bestimmen (Select Sprache INTO “envSprache” from Anwender where UserID = xy) und in den Abfragen verwenden (… where Sprache = “envSprache”). Selbst wenn ich die Variable nicht auf Datenbankebene, sondern auf Applikationsebene definiere, muss z.B. bei Verwendung von gespeicherten Funktionen die Sprache als Parameter übergeben.

Danke

Um die ganzen Variablen zu speichern, koenntest du dir ein Package machen, dort beim Sessionaufbau alles einlesen und dann im Package speichern.
Dann koenntest du gleich noch Funktionen dazu bauen, die erst pruefen, ob die Variable schon gefuellt ist und wenn nicht, dass sie dann den entsprechenden Wert holt. Irgendwie so

Ich kopiere mich mal aus einem meiner News-Beiträge:

Maybe a solution:

define a custom variable in your postgresql.conf like this:

#custom_variable_classes = ''           # list of custom variable class names
custom_variable_classes = 'myvar'
myvar.benutzer = 'foo'

Reload your configuration, now you can do this:

test=*# set myvar.benutzer = 'foobarbatz';
SET
test=*# select current_setting('myvar.benutzer');
 current_setting
-----------------
 foobarbatz
(1 row)

Hope that helps.

Andreas

Hallo Andreas,

Danke für den Hinweis. Habe nun auch die Doku zu dem Thema custom_variable_classes gelesen. Leider geht daraus (m.E.) nicht hervor in welchem Kontext die Variable existiert. Okay sie wird für alle Module sichtbar in der Konfdatei der Instanz definiert, aber kann ein und dieselbe Variable für unterschiedliche Logins zum gleichen Zeitpunkt auch individuelle Werte haben? Die Variable ‘enLanuguage’ könnte in der pg.conf dann mit dem default ‘de_DE’ belegt werden; wäre es dann aber auch möglich, dass der Benutzer Toby Smith diese Variable bei seinem Login mit dem Wert ‘en_GB’ belegt und dann alle Prozeduren die er ausführt diesen Wert verwenden, während Benutzer Jacques Cousteau den Wert ‘fr_FR’ setzt und für ihn dann alle Prozeduren diesen Wert verwenden? Ist dass bekannt oder müsste ich das austesten?

Danke

Ja.

Welcome to psql 8.3.7, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

test=# select current_setting('myvar.benutzer');
 current_setting
-----------------
 foobarbatz
(1 row)

Time: 0.430 ms
test=*# \q
kretschmer@tux:~$ psql -U foo  test
Timing is on.
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

test=> select current_setting('myvar.benutzer');
 current_setting
-----------------
 foo-benutzer
(1 row)

Die Variable ‘enLanuguage’ könnte in der pg.conf dann mit dem default ‘de_DE’ belegt werden; wäre es dann aber auch möglich, dass der Benutzer Toby Smith diese Variable bei seinem Login mit dem Wert ‘en_GB’ belegt und dann alle Prozeduren die er ausführt diesen Wert verwenden, während Benutzer Jacques Cousteau den Wert ‘fr_FR’ setzt und für ihn dann alle Prozeduren diesen Wert verwenden? Ist dass bekannt oder müsste ich das austesten?

Danke[/QUOTE]

alter user foo set myvar.benutzer = ‘foo-benutzer’;

Andreas