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) `Esto debería funcionar para las funciones:
fuente
Puede usar el comando REASSIGN OWNED
Simplemente inicie sesión en la base de datos con superusuario y ejecute a continuación
REASSIGN OWNED BY [old_user] TO [new_user];
Esto cambia todos los objetos, es decir, tablas, secuencia, función, etc., propiedad de old_role a la nueva función. No tiene que pensar qué tipo de objetos tiene el usuario, todos se cambiarán. Esto cambia los objetos solo si desea cambiar la propiedad de esa base de datos en sí misma, solo use
ALTER DATABASE name OWNER TO new_owner
Este es el mejor método ya que habrá n número de tablas, secuencia en lugar de bucles y secuencias de comandos bash
fuente
Bueno, no encontré un proceso de un solo paso, pero esto se encarga de todos los objetos que puedo ver en mi base de datos:
fuente