Dovresti sempre manipolare direttamente i cataloghi di sistema , se sai esattamente cosa stai facendo. Potrebbe avere effetti collaterali imprevisti. In alternativa, è possibile corrompere il database (o l'intero cluster di database) irreparabilmente.
La risposta di Jeremy , mentre sostanzialmente fa il trucco, non è consigliabile per il grande pubblico. Cambia incondizionatamente tutte le funzioni in uno schema. Sei sicuro che non ci siano funzioni di sistema interessate o funzioni installate da un modulo aggiuntivo?
Sarebbe inoltre inutile cambiare il proprietario di funzioni che appartengono già al proprietario designato.
Innanzitutto, controlla se REASSIGN OWNED
potrebbe funzionare per te:
modificare la proprietà degli oggetti del database di proprietà di un ruolo del database
Devi elencare tutti i ruoli per essere esplicitamente rinnegati. Ma riassegna anche le funzioni .
Per assegnare tutte le funzioni (e nessun altro oggetto) in un determinato schema a un nuovo proprietario (facoltativamente indipendentemente dal proprietario precedente):
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_%'
Questo genera i comandi SQL canoniciALTER FUNCTION ...
per modificare tutte le funzioni (nello schema specificato). È possibile controllare i comandi prima di eseguirli - uno per uno o tutti in una volta:
ALTER FUNCTION public.bar(text, text) OWNER TO foo;
ALTER FUNCTION public.foo(x integer) OWNER TO foo;
...
Ho incluso alcune WHERE
clausole commentate che potresti voler utilizzare per filtrare i risultati.
Il cast regprocedure
produce un nome di funzione valido con parametri, tra virgolette doppie ove necessario, schema - qualificato dove necessario per la corrente search_path
.
La funzione aggregata string_agg () richiede PostgreSQL 9.0 o successivo. Nella versione precedente sostituire con array_agg()
e array_to_string()
.
Si potrebbe mettere tutto questo in una DO
dichiarazione o di una funzione come dimostrato in questa risposta correlato:
In Postgres 9.5 o versioni successive, puoi semplificare la query usando nuovi tipi di identificatori di oggetti regnamespace
eregrole
:
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
viene sostituito in pg 11. Le note di rilascio dire: Sostituire tabella di sistemapg_proc
'sproisagg
eproiswindow
conprokind
(Peter Eisentraut) `