Вам слід коли-небудь безпосередньо маніпулювати системними каталогами , якщо ви точно знаєте, що робите. Це може мати несподівані побічні ефекти. Або ви можете пошкодити базу даних (або весь кластер баз даних) після ремонту.
Відповідь Джеремі , хоч і в основному робить трюк, не бажана для широкої громадськості. Він беззастережно змінює всі функції в схемі. Ви впевнені, що на функціональні функції системи чи на функції, встановлені додатковим модулем, не вплинуло?
Також було б безглуздо міняти власника функцій, які вже належать призначеному власнику.
По-перше, перевірте, чи REASSIGN OWNED
може це зробити для вас:
змінити право власності на об'єкти бази даних, що належать ролі бази даних
Ви повинні перелічити всі ролі, які слід явно відмовитись. Але він також переділяє функції .
Щоб призначити всі функції (та жодні інші об'єкти) у даній схемі новому власнику (необов'язково незалежно від попереднього власника):
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_%'
Це генерує канонічні команди SQLALTER FUNCTION ...
для зміни всіх функцій (у зазначеній схемі). Ви можете перевірити команди перед їх виконанням - по одній або всім відразу:
ALTER FUNCTION public.bar(text, text) OWNER TO foo;
ALTER FUNCTION public.foo(x integer) OWNER TO foo;
...
Я включив кілька коментованих WHERE
пропозицій, які ви можете використовувати для фільтрації результатів.
У ролях regprocedure
створюється дійсне ім'я функції з параметрами, де необхідне подвійне цитування, схема - кваліфікована там, де це необхідно для поточного search_path
.
Функція сукупності string_agg () вимагає PostgreSQL 9.0 або новішої версії. У старшій версії замінити на array_agg()
і array_to_string()
.
Ви можете помістити все це у DO
вислів чи функцію, як це було продемонстровано у цій відповіді:
У Postgres 9.5 або пізнішої версії ви можете спростити запит, використовуючи нові типи ідентифікаторів об'єкта regnamespace
таregrole
:
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
замінюється на стор 11. Примітки до випуску сказати: Замінити системну таблицюpg_proc
«sproisagg
іproiswindow
зprokind
(Peter Eisentraut)`