Kann ich search_path dauerfest in ein template schreiben?

Kann ich search_path dauerfest in ein template schreiben, so dass es beim Kopieren überlebt?

Ich habe für eine Applikation ein Template.
Wenn ich dieses anlege, erweitere ich nach Anlage der Schemata u.a. den Schema search_path:

ALTER DATABASE dbtemplate SET search_path = public, data, modul1, modul2;

Das Template wird vacuumed und mit datistemplate=1 zu einem solchen.

Jetzt kommt ein RoR-Projekt mit geeigneter Konfiguration, und dessen rake-Tasks legen eine Datenbank an, bevor es die Datenbank mit seinen Migrationsskripten aufbaut:

CREATE DATABASE datenbank WITH OWNER = projprod TEMPLATE = dbtemplate;

Wenn ich nun auf datenbank connecte, dann ist search_path wieder auf “public”, die Schemata sind aber angelegt.

Kann ich das überhaupt so lösen?
Warum verliert eine Datenbank beim Kopieren diese Information?
Wo wird diese eigentlich gespeichert?

Danke!

Peter

P.S.: Einstweilen habe ich search_path in der postgresql.conf gesetzt, da soll es aber wieder raus, weil noch mehrere an der Projekte auf diesen Server sollen.

Ähm, weiß nicht. Du kannst es aber per database setzen, alter database set … oder an den user nagln, alter user set …
Vermutlich reicht das, Dein Problem zu lösen, oder?

An die Datenbank (besser das Template) geklebt hatte ich ja schon, das geht nur beim template kopieren (was anderes ist create database ja im Endeffekt nicht) nicht mit.

Und beim user

versuchsballon=# alter user projprod set search_path = 'public, modul1, modul2';
NOTICE:  schema "public, modul1, modul2" does not exist
ALTER ROLE

wirkt es auch nicht sofort, sondern erst beim nächsten Login.

An die Session kann man das auch noch nageln, etc.
Egal, das sollte skriptierbar sein.
Ich werde den search_path wohl an die Userdefinition heften.


Das Thema ist ja überraschend komplex: Schema and search_path surprises - Postgres OnLine Journal

At the function level - only lasts for life of execution of function within function: ALTER FUNCTION some_func() SET search_path=public,utility;
At the session level - only lasts for the life of the session: set search_path=public,utility;
At the database user level - only takes affect for new sessions: ALTER ROLE postgres IN DATABASE mydb SET search_path = public, utility;
At the server user level – only takes affect for new sessions: ALTER ROLE postgres SET search_path = public,utility;
At the database level – only takes affect for new sessions: ALTER DATABASE mydb SET search_path = public, utility;

Was ist denn bitte der Unterschied zwischen “database user” und “server user”?

Interessieren würde mich schon (aus Admin-Sicht), wo diese information gespeichert wird.
Kann mich bitte jemand mit der Nase auf Literatur stoßen, wo in Postgres was definiert und gespeichert wird, und wie die Lebenszyklen der verschiedenen Kontexte aussehen (und woher diese ihre Konfiguration beziehen)?