У меня есть тип, который я бы хотел изменить, но я не знаю, кто еще его использует.
Как я могу проверить все функции, возвращающие этот тип?
У меня есть тип, который я бы хотел изменить, но я не знаю, кто еще его использует.
Как я могу проверить все функции, возвращающие этот тип?
Вы можете найти все зависимости в системном каталоге pg_depend
.
Это возвращает все функции в зависимости от типа. Т.е. не только с типом в предложении RETURNS
, но и с типом в качестве параметра функции:
SELECT objid::regproc AS function_name
, pg_get_functiondef(objid) AS function_definition
, pg_get_function_identity_arguments(objid) AS function_args
, pg_get_function_result(objid) AS function_returns
FROM pg_depend
WHERE refclassid = 'pg_type'::regclass
AND refobjid = 'my_type'::regtype -- insert your type name here
AND classid = 'pg_proc'::regclass; -- only find functions
Это также работает для табличных функций:
...
RETURNS TABLE (foo my_type, bar int)
Использование функций информации системного каталога.
Могут быть и другие зависимости (не от функций). Удалите последнее условие WHERE
из моего запроса для проверки (и, очевидно, адаптируйте список SELECT
).
И все еще существует возможность использования типа явно (например, в приведении) в запросах в теле функции или в динамическом SQL. Вы можете определить такие варианты использования, только проанализировав текст тела функции. В системе не зарегистрировано явных зависимостей.
Связанный:
Как упоминал Эрвин Брандштеттер, это работает только для функций, непосредственно возвращающих тип данных.
SELECT * FROM information_schema.routines r
WHERE r.type_udt_name = 'YOUR_DATA_TYPE' ORDER BY r.routine_name;
SELECT * FROM information_schema.routines r WHERE r.type_udt_name = 'YOUR_DATA_TYPE' ORDER BY r.routine_name;
?
- person zb226; 05.11.2015
TABLE(...)
или SETOF record
содержащих рассматриваемый тип.
- person Erwin Brandstetter; 05.11.2015