如何在 PostgreSQL 中使用特定 table 获取存储过程列表?

How to get a list of stored procedures using a specific table in PostgreSQL?

在 PostgreSQL (9.3) 中是否有一种简单的方法来获取使用特定 table 的存储过程的列表?

我正在更改几个 table 并且需要修复使用它们的存储过程。

这个任务并不简单,因为 PostgreSQL 没有任何关于函数和表之间依赖关系的证据。据我所知,没有任何 public 工具可以做到这一点。一个是 Skype,但我不确定这个工具是否在 Skype 之外发布。如果你知道C,那么你可以修改plpgsql_check,这里有这个信息,但是没有用到。

解决方案很差-您可以尝试在源代码中搜索特定字符串。

postgres=# CREATE OR REPLACE FUNCTION foo()
RETURNS int AS $$
BEGIN
  RETURN (SELECT a FROM t1);
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION

postgres=# SELECT oid::regprocedure FROM pg_proc WHERE prosrc ~ '\mt1\M';
┌───────┐
│  oid  │
╞═══════╡
│ foo() │
└───────┘
(1 row)

\m \M 是正则表达式约束见 related docs.

正文中包含文本 'thetable' 的函数。

查询return的函数名、行号和包含'thetable'的行:

select *
from (
    select proname, row_number() over (partition by proname) as line, textline
    from (
        select proname, unnest(string_to_array(prosrc, chr(10))) textline
        from pg_proc p
        join pg_namespace n on n.oid = p.pronamespace
        where nspname = 'public'
        and prosrc ilike '%thetable%'
        ) lines
    ) x
    where textline ilike '%thetable%';

具有与thetable关联的类型的任何参数或return值的函数。

例如:

create function f2(rec thetable)...
create function f1() returns setof thetable... 

此查询给出函数的名称、return 类型和参数类型:

with rtype as (
    select reltype 
    from pg_class
    where relname = 'thetable')
select distinct on (proname) proname, prorettype, proargtypes
from pg_proc p
join pg_namespace n on n.oid = p.pronamespace
cross join rtype
where nspname = 'public'
and (
    prorettype = reltype 
    or reltype::text = any(string_to_array(proargtypes::text, ' '))) 

当然,您可以将查询合并为一个。我将它们用于不同的目的。