Solo debe manipular los catálogos del sistema directamente, si sabe exactamente lo que está haciendo. Puede tener efectos secundarios inesperados. O puede dañar la base de datos (o todo el clúster de la base de datos) sin posibilidad de reparación.
La respuesta de Jeremy , aunque básicamente hace el truco, no es aconsejable para el público en general. Cambia incondicionalmente todas las funciones en un esquema. ¿Está seguro de que no hay funciones del sistema afectadas o funciones instaladas por un módulo adicional?
Tampoco tendría sentido cambiar el propietario de las funciones que ya pertenecen al propietario designado.
Primero, verifique si REASSIGN OWNED
podría funcionar para usted:
cambiar la propiedad de los objetos de la base de datos propiedad de un rol de base de datos
Tiene que enumerar todos los roles que se desautorizarán explícitamente. Pero también reasigna funciones .
Para asignar todas las funciones (y ningún otro objeto) en un esquema dado a un nuevo propietario (opcionalmente, independientemente del propietario anterior):
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_%'
Esto genera los comandos canónicos de SQLALTER FUNCTION ...
para cambiar todas las funciones (en el esquema especificado). Puede inspeccionar los comandos antes de ejecutarlos, uno por uno o todos a la vez:
ALTER FUNCTION public.bar(text, text) OWNER TO foo;
ALTER FUNCTION public.foo(x integer) OWNER TO foo;
...
Incluí algunas WHERE
cláusulas comentadas que quizás quieras usar para filtrar los resultados.
La conversión a regprocedure
produce un nombre de función válido con parámetros, entre comillas dobles cuando sea necesario, esquema - calificado cuando sea necesario para la corriente search_path
.
La función agregada string_agg () requiere PostgreSQL 9.0 o posterior. En versiones anteriores, sustituya con array_agg()
y array_to_string()
.
Usted podría poner todo esto en una DO
declaración o una función como se demuestra en esta respuesta relacionada:
En Postgres 9.5 o posterior, puede simplificar la consulta utilizando nuevos tipos de identificadores de objetos regnamespace
yregrole
:
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
se sustituye en pg 11. Las notas de la versión decir: Reemplazar tabla de sistemapg_proc
'sproisagg
yproiswindow
conprokind
(Peter Eisentraut) `