SQL Fehler / Datenbankfehler?

ny_unity

SQL-Guru
Beiträge
168
Hallo zusammen,

wir haben letzte Woche von Firebird 3 auf Postgres migriert. In unserem Programm erhalten wir oft einen Fehler, den ich jetzt bei SQL Abfragen (Update einer Tabelle) reproduzieren konnte.

Fehler:
7: FEHLER: unbekannter Konfigurationsparameter »USER_SESSION.User_Id« CONTEXT: SQL-Anweisung »SELECT current_setting('USER_SESSION.User_Id')« PL/pgSQL-Funktion dblog_lohnabz_ins() Zeile 9 bei SQL-Anweisung

Das SQL dazu lautet:
Code:
INSERT INTO "public".lohnabz (personalnr, datum, abrjahr, abrmonat, abzugart, abzugbezug, sachkonto, betrag, zaehler, trans, ibmnr, auszahlok, auszahlart, info, auftragnr, einsortnr, trfield, repl_id, repl_database, datumdta, cprotbediener, dtprotdatum, intervall, belegnr, abrjahrbis, abrmonatbis, zahl_deaktiv, id_serie) VALUES (10086, '2022-11-21 15:08:06.475187+01', 2022, 11, 1, '', 0, 200, 0, 'N', 0, '', '', 'test', 0, 0, '', 0, 0, null, 'GR', '2022-11-21 15:08:45', 0, 0, 0, 0, 0, 0)

Kann mir jemand sagen, wie ich den USER_SESSION Fehler beheben kann?

Besten Dank!

Erik
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.848
Die Fehlermeldung paßt nicht zum gezeigten Code, aber ich kann das nachvollziehen:

Code:
ERROR:  unrecognized configuration parameter "user_session.user_id"
postgres=# set user_session.user_id=1;
SET
postgres=# show user_session.user_id;
 user_session.user_id 
----------------------
 1
(1 row)

postgres=#

Du kannst also bestimmte Variablen definieren und später auch abfragen. Dein Fehler zeigt, daß Du eine nicht gesetzte bzw. initialisierte Variable abfragst.
 

akretschmer

Datenbank-Guru
Beiträge
9.848
okay, kannst du mir weiterhelfen, wie ich diese Variable setze?
siehe Zeile 2 in meinem Post, bzw. jetzt Zeile 3 (hatte Zeile 1 nicht mit kopiert ...)

Code:
postgres=# show user_session.user_id;
ERROR:  unrecognized configuration parameter "user_session.user_id"
postgres=# set user_session.user_id=1;
SET
postgres=# show user_session.user_id;
 user_session.user_id 
----------------------
 1
(1 row)

postgres=#
 

ny_unity

SQL-Guru
Beiträge
168
okay, zum Verständnis: Es arbeiten circa 20 Personen gleichzeitig auf der Datenbank, jeder erhält diesen Fehler aus wenigen Mitarbeitern. Wie definiere ich, dass jeder seine eigene ID erhält oder ist das egal?
 

akretschmer

Datenbank-Guru
Beiträge
9.848
okay, zum Verständnis: Es arbeiten circa 20 Personen gleichzeitig auf der Datenbank, jeder erhält diesen Fehler aus wenigen Mitarbeitern. Wie definiere ich, dass jeder seine eigene ID erhält oder ist das egal?
Das kommt auf Deine Logig an, die kenne ich nicht. Ich kann also diese Frage nicht beantworten. Du kannst diese Variable für alle globla in der postgresql.conf definieren, du kannst sie per Datenbank-User setzen (via alter user set ...), Du kannst die beim Login machen (aus der Applikation heraus, als erster Befehl), ... aber es wird ja offenbar damit irgend etwas gesteuert ...
 

ny_unity

SQL-Guru
Beiträge
168
Der Hersteller ist schwer zu erreichen von der Applikation die die Daten aus der Datenbank liest und rein schreibt.

Was kann damit gesteuert werden und was könnte passieren wenn ich global für alle setze?
 

castorp

Datenbank-Guru
Beiträge
505
Was kann damit gesteuert werden und was könnte passieren wenn ich global für alle setze?
Das wissen wir nicht, weil wir die Anwendung nicht kennen oder geschrieben haben.

Vom Namen her würde ich vermuten, dass da die Session ID einer Anwendungssession erwartet wird. Da würde ich schwer davon ausgehen, dass die pro User unterschiedlich ist - und auch jedes mal einen anderen Wert hat wenn sich ein Benutzer anmeldet.

Das wird nur der Support des Herstellers der Anwendung beheben können. Ich vermute(!) es ist ein Fehler in der Anwendung.
 

akretschmer

Datenbank-Guru
Beiträge
9.848
Was kann damit gesteuert werden und was könnte passieren wenn ich global für alle setze?

ich spinne mal: Du hast eine Applikation für viele Mandanten, und steuerst die Auswahl des Mandanten damit. Dafür hast Du z.B. diverse VIEWs definiert, aber auch stored Procs etc.
Was passieren würde, wenn das global für alle auf denselben Mandanten gesetzt wird dürfte leicht zu erraten sein.
 

ny_unity

SQL-Guru
Beiträge
168
Ok, leuchtet ein. Was mir aber nicht klar ist, wenn ich über php eine Verbindung zur Datenbank aufbaue, wieso erhalte ich da auch den Fehler? Da kann mir die Applikationen ja keine ID setzen?! Wer setzt die ID dann?
 
Zuletzt bearbeitet von einem Moderator:

akretschmer

Datenbank-Guru
Beiträge
9.848
mal als demo:

Code:
postgres=# select * from foo;
 id | val 
----+-----
  1 |   1
  2 |   2
  3 |   3
  4 |   4
  5 |   5
  6 |   6
  7 |   7
  8 |   8
  9 |   9
 10 |  10
(10 rows)

postgres=# create view my_view as select *, current_setting('user_session.my_user_id') from foo;
CREATE VIEW
postgres=# select * from my_view;
ERROR:  unrecognized configuration parameter "user_session.my_user_id"
postgres=# set user_session.my_user_id=42;
SET
postgres=# select * from my_view;
 id | val | current_setting 
----+-----+-----------------
  1 |   1 | 42
  2 |   2 | 42
  3 |   3 | 42
  4 |   4 | 42
  5 |   5 | 42
  6 |   6 | 42
  7 |   7 | 42
  8 |   8 | 42
  9 |   9 | 42
 10 |  10 | 42
(10 rows)

postgres=#

Erst wenn user_session.my_user_id definiert ist, funktioniert der VIEW.
 

ny_unity

SQL-Guru
Beiträge
168
Okay, das hab ich ja verstanden.

Was mir noch nicht einleuchtet ist, wenn der User sich an der Applikation anmeldet, bekommt er vom Programm eine ID.

Muss ich jetzt wenn ich über php eine Verbindung aufbaue, mir selbst eine ID vergeben?
 
Werbung:
Oben