Sie sollten Systemkataloge nur dann direkt bearbeiten , wenn Sie genau wissen, was Sie tun. Es kann unerwartete Nebenwirkungen haben. Oder Sie können die Datenbank (oder den gesamten Datenbankcluster) irreparabel beschädigen.
Während Jeremys Antwort im Grunde genommen den Trick macht, ist sie für die breite Öffentlichkeit nicht ratsam . Es ändert bedingungslos alle Funktionen in einem Schema. Sind Sie sicher, dass keine Systemfunktionen betroffen sind oder Funktionen von einem Zusatzmodul installiert wurden?
Es wäre auch sinnlos, den Eigentümer von Funktionen zu ändern, die bereits dem designierten Eigentümer gehören.
Überprüfen Sie zunächst, ob REASSIGN OWNED
es für Sie funktioniert:
den Besitz von Datenbankobjekten ändern, die einer Datenbankrolle gehören
Sie müssen alle Rollen auflisten, die explizit abgelehnt werden sollen. Es weist aber auch Funktionen neu zu .
So weisen Sie einem neuen Eigentümer alle Funktionen (und keine anderen Objekte) in einem bestimmten Schema zu (optional unabhängig vom vorherigen Eigentümer):
SELECT string_agg('ALTER FUNCTION ' || oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM pg_catalog.pg_proc p
JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE n.nspname = 'public';
-- AND p.relowner <> (SELECT oid FROM pg_roles WHERE rolname = 'foo')
-- AND p.proname ~~ 'f_%'
Dadurch werden die kanonischen SQL-BefehleALTER FUNCTION ...
zum Ändern aller Funktionen (im angegebenen Schema) generiert . Sie können die Befehle überprüfen, bevor Sie sie ausführen - einzeln oder alle gleichzeitig:
ALTER FUNCTION public.bar(text, text) OWNER TO foo;
ALTER FUNCTION public.foo(x integer) OWNER TO foo;
...
Ich habe einige kommentierte WHERE
Klauseln eingefügt, die Sie möglicherweise zum Filtern der Ergebnisse verwenden möchten.
Die Umwandlung in regprocedure
erzeugt einen gültigen Funktionsnamen mit Parametern, gegebenenfalls in doppelten Anführungszeichen, einem Schema, das für den aktuellen Bedarf qualifiziert ist search_path
.
Die Aggregatfunktion string_agg () erfordert PostgreSQL 9.0 oder höher. In der älteren Version durch array_agg()
und ersetzen array_to_string()
.
Sie könnten dies alles in eine DO
Anweisung oder eine Funktion einfügen, wie in dieser verwandten Antwort gezeigt:
In Postgres 9.5 oder höher können Sie die Abfrage mit neuen Objektidentifikationstypenregnamespace
regrole
vereinfachen und :
SELECT string_agg('ALTER FUNCTION '|| oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM pg_catalog.pg_proc
WHERE pronamespace = 'public'::regnamespace;
-- AND relowner <> 'foo'::regrole
-- AND proname ~~ 'f_%'
pg_proc.proisagg
in pg 11 ersetzt Die Release Notes sagen: Ersetzen Systemtabellepg_proc
‚sproisagg
undproiswindow
mitprokind
(Peter Eisentraut)`