Как изменить владельца функции в 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';