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)`Dies sollte für folgende Funktionen funktionieren:
quelle
Sie können den Befehl REASSIGN OWNED verwenden
Melden Sie sich einfach mit dem Superuser in der Datenbank an und führen Sie die folgenden Schritte aus
REASSIGN OWNED BY [old_user] TO [new_user];
Dies ändert alle Objekte, dh Tabellen, Sequenzen, Funktionen usw., die old_role gehören, in die neue Rolle. Sie müssen nicht darüber nachdenken, welche Art von Objekten der Benutzer hat, sie werden alle geändert. Dies ändert die Objekte nur, wenn Sie den Eigentümer dieser Datenbank selbst ändern möchten
ALTER DATABASE name OWNER TO new_owner
Dies ist die beste Methode, da es nicht so viele Tabellen gibt, da die Reihenfolge eher für Schleifen und Bash-Skripte gilt
quelle
Nun, ich habe keinen einstufigen Prozess gefunden, aber dieser kümmert sich um alle Objekte, die ich in meiner Datenbank sehen kann:
quelle