如何在 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, ' ')))
当然,您可以将查询合并为一个。我将它们用于不同的目的。
在 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, ' ')))
当然,您可以将查询合并为一个。我将它们用于不同的目的。