关于sql:如何检查哪个函数使用了一个类型?

How to check which function uses a type?

我有一种类型,我想改变,但我不知道还有谁在使用它。

如何检查返回此类型的所有函数?


您可以在系统目录pg_depend中找到所有依赖项。

这将根据类型返回所有??函数。即不仅是RETURNS子句中具有类型的那些,还有类型为函数参数的那些:

1
2
3
4
5
6
7
8
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

这也适用于表函数:

1
2
...
RETURNS TABLE (foo my_type, bar INT)

使用系统目录信息功能。

可能存在其他依赖项(不是函数)。从我的查询中删除最后一个WHERE条件以进行测试(并显然调整SELECT列表)。

并且仍然有可能在函数体或动态SQL中的查询中显式使用类型(例如,在强制转换中)。您只能通过解析函数体的文本来识别此类用例。系统中未注册明确的依赖项。

有关:

  • 如何获取函数参数列表(所以我可以删除一个函数)
  • DROP FUNCTION不知道参数的数量/类型?


正如Erwin Brandstetter所提到的,这仅适用于直接返回数据类型的函数。

1
2
SELECT * FROM information_schema.routines r
WHERE r.type_udt_name = 'YOUR_DATA_TYPE' ORDER BY r.routine_name;