Vous ne devez jamais manipuler directement les catalogues système que si vous savez exactement ce que vous faites. Cela peut avoir des effets secondaires inattendus. Ou vous pouvez corrompre la base de données (ou l'ensemble du cluster de base de données) au-delà de toute réparation.
La réponse de Jeremy , tout en faisant l'essentiel, est pas recommandée au grand public. Il modifie inconditionnellement toutes les fonctions d'un schéma. Êtes-vous sûr qu'aucune fonction système n'est affectée ou aucune fonction installée par un module supplémentaire?
Il serait également inutile de changer le propriétaire des fonctions qui appartiennent déjà au propriétaire désigné.
Vérifiez d'abord si REASSIGN OWNED
pourrait fonctionner pour vous:
modifier la propriété des objets de base de données appartenant à un rôle de base de données
Vous devez répertorier tous les rôles à désavouer explicitement. Mais ça réaffecte également des fonctions .
Pour affecter toutes les fonctions (et aucun autre objet) d'un schéma donné à un nouveau propriétaire (éventuellement indépendamment du propriétaire précédent):
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_%'
Cela génère les commandes SQL canoniquesALTER FUNCTION ...
pour modifier toutes les fonctions (dans le schéma spécifié). Vous pouvez inspecter les commandes avant de les exécuter - une par une ou toutes à la fois:
ALTER FUNCTION public.bar(text, text) OWNER TO foo;
ALTER FUNCTION public.foo(x integer) OWNER TO foo;
...
J'ai inclus quelques WHERE
clauses commentées que vous voudrez peut-être utiliser pour filtrer les résultats.
Le transtypage en regprocedure
produit un nom de fonction valide avec des paramètres, entre guillemets si nécessaire, schéma - qualifié si nécessaire pour le courant search_path
.
La fonction d'agrégation string_agg () nécessite PostgreSQL 9.0 ou version ultérieure. Dans l'ancienne version, remplacez par array_agg()
et array_to_string()
.
Vous pouvez mettre tout cela dans une DO
instruction ou une fonction comme démontré dans cette réponse connexe:
Dans Postgres 9.5 ou version ultérieure, vous pouvez simplifier la requête à l'aide de nouveaux types d'identifiant d'objet regnamespace
etregrole
:
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
est remplacé en pg 11. Les notes de version dit: Remplacer le tableau du systèmepg_proc
deproisagg
etproiswindow
avecprokind
(Peter Eisentraut) `