Parallele Query endet mit "permission denied for database"

Folgendes Szenario:
Ein select hat einen Ausführungsplan mit parallelen Anteilen.

Wenn ich diese Query ausführe erhalte ich ein
SQL-Fehler [42501]:
ERROR: permission denied for database “xyz”
DETAIL: User does not have CONNECT privilege.
CONTEXT: parallel worker

Setze ich nun max_parallel_workers_per_gather=0 kann die Query ausgeführt werden.
Aber ich möchte nicht die Parallelisierung ausschalten.

Was könnte der Grund für den Fehler sein. Mir ist nicht klar was ich an den Berechtigungen ändern muss, damit es mit Parallelisierung funktioniert?

Hmm, komisch.

Sind da evtl “foreign table”, DB links oder selbstgeschriebene Funktionen mit in der Abfrage?

Hi Castor, nein es wird nur auf lokale Tables zugegriffen.
Aber wieso sollten unterschiedliche Berechtigungen auf DB-Ressourcen bei paralleler und sequentieller Ausführung ziehen?

Mein - zugegeben sehr schwacher - Verdacht war etwas in der Richtung: der Benutzer der für die Anmeldung an dem foreign server (oder DbLink) verwendet wird, hat ein connection limit.

Aber wenn weder foreign tables, noch DbLink beteiligt sind, kann man das wohl ausschliessen.

Was ist denn die exakte Postgres Version? (Ausgabe von select version();)

Die Version ist PostgreSQL 16.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-22), 64-bit

Benutzt Du AshPostgres?

Hier gibt es einen Hinweis dazu:

Hm, ein Kunde hat den selben Fehler beklagt. Ich kann mir vorstellen, daß die Commits 5a2fed911a und 95f5a52372 hier irgendein Problem eingebaut haben.

Es wäre interessant zu wissen, was genau der User, der die Abfrage ausführt, vorher gemacht hat.

  • Ist SET SESSION AUTHORIZATION oder SET ROLE ausgeführt worden?
  • Hat der User mit ALTER ROLE ... SET ROLE ... eine Standardrolle zugewiesen bekommen? Das sieht man mit \ddp in psql.
  • Ist eine Extension wie set_user in Verwendung, die die aktive Rolle verändert?
  • Kann es sein, daß die Anzahl der Datenbankverbindungen an max_connections - superuser_reserved_connections - reserved_connections herankommt?

Irgendetwas muß anders sein als normal, sonst würde der Fehler jedesmal bei der Verwendung von Parallel Query kommen.

1 „Gefällt mir“

Nein ist wird kein Ash verwendet.

Ja der einloggende User bekommt eine neue Rolle.
ALTER ROLE role1 IN DATABASE db1 SET role=role2;
Nachdem ich role2 das Connect privilege gegeben habe funktioniert es auch.
Vielen Dank für den Hinweis! 95f5a52372 scheint mir wohl der Grund zu sein.

1 „Gefällt mir“

Danke für die Bestätigung und den Workaround.
Ich habe den Bug gemeldet, bin aber nicht sicher, ob mein Fix richtig ist.

1 „Gefällt mir“

unser Laurenz ist halt echt der Beste!

Zustimmung meinerseits :wink:

Der Fehler ist mit Commit 34486b6092 behoben. Das Problem wird also mit den nächsten Minor Releases am 13. Februar 2025 behoben sein.

4 „Gefällt mir“