Как изменить владельца функции в postgres

Я пишу script для изменения всех функций postgres (меняя владельца каждой функции). Я могу перечислить все имена функций, используя postgres-запрос, но не могу указать параметры для каждой из этих функций.

Моя проблема будет решена, если я получу решение для любой из нижеперечисленных проблем:

  • Есть ли способ перечислить тип данных параметров в каждой из функций.
  • Есть ли у нас какой-либо подход к изменению функций, где вместо передачи типа параметра я могу отправить некоторую wild-карту. Например, я могу написать ALTER FUNCTION schemaname.func(текст) ВЛАДЕЛЕЦ В 'newowner' в виде: ALTER FUNCTION schemaname.func(*) ВЛАДЕЛЕЦ В 'newowner'.

Ответ 1

Есть ли способ перечислить тип данных параметров в каждой из функций.

Да, используйте функцию pg_get_function_identity_arguments():

Далее будет создан SQL script для изменения всех функций из схемы someschema:

select 'alter function '||nsp.nspname||'.'||p.proname||'('||pg_get_function_identity_arguments(p.oid)||') owner to newowner;'
from pg_proc p
  join pg_namespace nsp ON p.pronamespace = nsp.oid
where nsp.nspname = 'someschema';

Вы можете генерировать вывод этого файла в файл, а затем запускать созданный script.

Если у вас есть имена функций, для которых требуется кавынг, вам, вероятно, нужно будет использовать quote_ident для объединения имен функций.

Вы можете обернуть все это в функцию и использовать динамический SQL, чтобы сделать жизнь проще, если вам это нужно на регулярной основе.

Ответ 2

У меня была та же проблема, но pg_get_function_identity_arguments (p.oid) не работал у меня. Поэтому я заменил эту функцию на oidvectortypes (p.proargtypes).

select 'alter function '||nsp.nspname||'.'||p.proname||'('||oidvectortypes(p.proargtypes)||') owner to newowner;'
from pg_proc p 
join pg_namespace nsp ON p.pronamespace = nsp.oid
where nsp.nspname = 'someschema';